我已成功编写了一个应用程序来按下另一个应用程序中的按钮.现在我试图在循环中重复按下按钮,我的应用程序挂起,但我不明白为什么.
上下文
我有一个对我很有帮助的应用程序,但开发它的人并没有想到一切.在应用程序中的某个时刻,会打开一个对话框,要求确认用已上载的数据替换现有数据.我需要单击“确定”才能同意,但问题是我将大量数据上传到此应用程序,并且没有“全部应用”复选框.所以我必须反复点击OK.因此,我正在处理一个应用程序,它将按下OK按钮,直到对话框停止显示.
码
代码单击按钮一次(这可行)…
private void btnOKloop_Click(object sender,System.EventArgs e) { int hwnd=0; IntPtr hwndChild = IntPtr.Zero; //Get a handle for the Application main window hwnd = FindWindow(null,"Desired MessageBox"); hwndChild = findwindowex((IntPtr)hwnd,IntPtr.Zero,"Button","OK"); //send system message if (hwnd != 0) { SendMessage((int)hwndChild,BN_CLICKED,IntPtr.Zero); } else { MessageBox.Show("Button Could Not Be Found!","Warning",MessageBoxButtons.OK); } }
用于单击循环中的按钮的代码(此挂起)…
private void btnOKloop_Click(object sender,System.EventArgs e) { int hwnd=0; IntPtr hwndChild = IntPtr.Zero; hwnd = FindWindow(null,"OK"); do { SendMessage((int)hwndChild,IntPtr.Zero); } while (hwnd != 0);
解决方法
你的循环永远不会退出:
hwnd = FindWindow(null,"Desired MessageBox"); hwndChild = findwindowex((IntPtr)hwnd,"OK"); do { SendMessage((int)hwndChild,IntPtr.Zero); } while (hwnd != 0);
你已经将你的hwnd变量设置在循环之外然后循环,直到值变为0.但是因为你没有在循环中设置值,所以它永远不会改变.您可以通过在循环中移动变量赋值语句来解决此问题:
do { hwnd = FindWindow(null,"Desired MessageBox"); if (hwnd != 0) { hwndChild = findwindowex((IntPtr)hwnd,"OK"); SendMessage((int)hwndChild,IntPtr.Zero); } } while (hwnd != 0);
你可能会遇到一些麻烦….它可能移动得太快,试图在对话框有机会打开之前找到下一个对话框.我建议你添加一个小延迟并将其调整到适当的时间段以允许下一个窗口打开:
do { hwnd = FindWindow(null,IntPtr.Zero); } System.Threading.Thread.Sleep(250); // 250 milliseconds: 0.25 seconds between clicks. } while (hwnd != 0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。