当我在任何当前运行的应用程序A中获得一些特定输入时,我想显示一个弹出窗口。根据弹出窗口的对话框结果,我想通过使用 SendKeys 类发送击键来将文本修改为应用程序A的当前文本框。我目前正在使用低级键盘挂钩,这意味着我可以在应用程序A处理它之前获取 keydown 事件。在这种情况下,我的弹出窗口将在输入文本的最后一部分出现在A的文本框中之前显示。Popup 将获得焦点并阻止这部分文本到达A。
例如,我正在搜索lol关键字。用户打开记事本并输入“lol”。我的应用程序此时应该显示弹出窗口“按 Enter 添加 blahblahblah 文本”。弹出窗口成为前景。如果用户按下 Enter 键,应用程序将关闭此对话框,使记事本再次回到前台,并将“blahblahblah”作为击键发送到系统。
记事本一切正常,但如果目标应用程序/系统运行缓慢并且有时没有响应怎么办?考虑下一个测试应用程序:
public Form1()
{
InitializeComponent();
timer1.Enabled = true;
timer1.Interval = 2000;
}
private void timer1_Tick(object sender, EventArgs e)
{
System.Threading.Thread.CurrentThread.Join(1900);
}
此表单包含一个文本框,其 UI 线程 95% 的时间都在休眠。它每 2 秒处理一次键盘输入。因此,如果用户在这样的窗口中输入lol,我的应用程序很可能会在“lol”文本出现在文本框中之前显示弹出窗口。
我不想在所有文本到达目标应用程序A之前显示我的弹出窗口。您能否建议任何方法来获得某个进程消耗所有键盘输入的时刻?
SendKeys.Flush() 对我不起作用。我想,为其他目的而设计的 Process.WaitForInputIdle() 也是如此。我试图通过 SendMessage 将 WM_ACTIVATE 消息发送到目标应用程序,因为我认为这正是我正在寻找的:
SendMessage 函数调用指定窗口的窗口过程,直到窗口过程处理完消息才返回。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950%28v=vs.85%29.aspx
User32.SendMessage(activeWindow, WM_ACTIVATE, WA_ACTIVE, 0)
调用返回 0,但没有创建所需的暂停,并且我的弹出窗口出现在文本之前。
提前致谢。