【问题标题】:how to send key's to any application that is currently running from background program (c++)如何将密钥发送到当前从后台程序运行的任何应用程序(c++)
【发布时间】:2010-10-06 23:31:42
【问题描述】:

我的问题是如何从后台运行的应用程序向任何应用程序发送一些密钥?假设我创建了向左箭头键 ALT+S 的快捷方式,并且当我在任何应用程序中并且当我按下 ALT+S 时,后台应用程序响应该快捷方式并发送到当前打开的程序向左箭头键。 这是我在 Embarcadero c++ 2010 中编写的代码,用于在每 200 毫秒按 alt+s 时模拟向左箭头:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
     bool bBothPressed = GetAsyncKeyState(VK_MENU)  && GetAsyncKeyState(0x53);
    if(bBothPressed){
        // ShowMessage("control!");
        keybd_event(VK_LEFT, 0, 0, 0);
    }
} 

...这对我的应用程序来说很好,但我想知道的是如何为全局范围(任何应用程序)包含该代码,而不仅仅是这个应用程序。

【问题讨论】:

    标签: c++ winapi background shortcut


    【解决方案1】:

    我强烈建议您使用 RegisterHotKey 而不是 GetAsyncKeyState。这样您就不需要循环或计时器,从而使您的应用程序更加可靠和响应迅速。

    要模拟对另一个应用程序/窗口的按键操作,您需要:

    A)聚焦特定窗口:

    BringWindowToTop(hwnd);
    SetForegroundWindow(hwnd);
    SetFocus(hwnd);
    

    B) 发送 keydown + keyup 事件:

    keybd_event(keycode, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(keycode, 0, KEYEVENTF_KEYUP, 0);
    

    这应该足够了。但是,请记住,用户可能已经在按下您正在模拟的键之一,因此结果可能不是您所期望的。为避免这种情况,您需要检查按键是否已被按下(在此处使用 GetAsyncKeyState),然后在执行 B 之前发送 keyup。

    更新:

    如果您希望将按键发送到当前在前台(被聚焦)的任何应用程序,您可以跳过 A

    【讨论】:

    • 重点是如何让应用程序像服务一样在后台运行,并在按下 ALT+S 时等待,在按下时执行某些命令,在这种情况下只是向左箭头,主要的事情是快捷键 alt+s 必须像任何应用程序中的左箭头一样执行。我想做的是像按下 alt+s 时激活的宏。我知道如何处理某些特定的应用程序,但我需要的是 alt+s 快捷方式必须处理到当前打开的每个进程。
    • thnx 伙计,你的回答非常有帮助我是编程初学者,所以我的测试需要一点时间:),但理论上这就是我要寻找的...:)
    【解决方案2】:

    SendInput() 看起来可能对您有用。

    【讨论】:

    • 在这种情况下,sendinput 是发送快捷方式到另一个应用程序的好功能,我知道如何处理它到特定的应用程序(比如处理它到记事本),但是有一些功能可以处理所有应用程序,而不指定每个应用程序?
    猜你喜欢
    • 2020-11-24
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多