C# 抓住某个特定的时刻;“拉吉”;应用程序窗口完成对其键盘输入的处理

C# 抓住某个特定的时刻;“拉吉”;应用程序窗口完成对其键盘输入的处理,c#,winapi,input,keyboard,sendkeys,C#,Winapi,Input,Keyboard,Sendkeys,当我在任何当前运行的应用程序a中获得一些特定输入时,我想显示一个弹出窗口。根据弹出窗口的对话框结果,我想通过使用SendKeys类发送击键,将文本修改为应用程序的当前文本框。我目前正在使用低级键盘挂钩,这意味着我可以在应用程序处理它之前获取按键事件。在这种情况下,我的弹出窗口将在输入文本的最后一部分出现在A的文本框中之前显示。弹出窗口将获得焦点并阻止这部分文本到达A 例如,我正在搜索lol关键字。用户打开记事本并输入“lol”。此时,我的应用程序将显示弹出窗口“按Enter键添加blahblah

当我在任何当前运行的应用程序a中获得一些特定输入时,我想显示一个弹出窗口。根据弹出窗口的对话框结果,我想通过使用SendKeys类发送击键,将文本修改为应用程序的当前文本框。我目前正在使用低级键盘挂钩,这意味着我可以在应用程序处理它之前获取按键事件。在这种情况下,我的弹出窗口将在输入文本的最后一部分出现在A的文本框中之前显示。弹出窗口将获得焦点并阻止这部分文本到达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_激活消息发送到目标应用程序,因为我认为这正是我要寻找的:

SendMessage函数调用指定对象的窗口过程 窗口,直到窗口过程处理完毕才返回 信息

调用返回0,但不创建所需的暂停,我的弹出窗口显示在文本之前


提前感谢。

发送消息
不会等待轮到它。换句话说,它不会将消息附加到消息队列的后面,以在所描述的场景中充当哨兵。类似地,
PostMessage
也不起作用:已发布的消息放在消息队列的前面。除此之外,您不应该发送
WM\u ACTIVATE
消息。这将使应用程序崩溃。(当他们已经被激活时,他们会收到激活消息,这是不应该发生的。)嗯,好的,谢谢你的回答。我读过这篇文章:我打算尝试使用whu-KEYBOARD-hook而不是whu-KEYBOARD-LL。我知道那种方法的所有缺点,但为什么不试试呢。我希望这将有助于我的应用程序以正确的方式与目标应用程序合作。
User32.SendMessage(activeWindow, WM_ACTIVATE, WA_ACTIVE, 0)