如何从Windows中的外部应用程序激活一些窗口?

时间:2011-11-27 13:55:01

标签: windows winapi external sendkeys

我想向外部应用程序发送一些按键,并且它工作正常,但是当我尝试将按键发送到同一个外部应用程序的子窗口时,由于某些原因不起作用,所以我需要帮助。假设我们想要从记事本中打印剪贴板文本,并希望一步完成。在代码看起来像这样。

        #include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    using namespace std;

    int main(int argc, char* argv[]){
        WinExec("notepad", 1);
        Sleep(1000);
        HWND handle = FindWindow("notepad",0);  // it's handling as well
        SetForegroundWindow(handle);        
        keybd_event(VK_CONTROL, 0, 0, 0);   // simulate CTRL down
        keybd_event(VkKeyScan('V'), 0, 0, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); 
        Sleep(500);
        keybd_event(VK_CONTROL, 0, 0, 0);   // simulate CTRL down
        keybd_event(VkKeyScan('P'), 0, 0, 0);
        keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // simulate CTRL up
        Sleep(1000);
        HWND handle1 = FindWindow(0, "Print");  // it wann't find "Print" window
        SetForegroundWindow(handle1);
        keybd_event(VK_MENU, 0, 0, 0); // simulate ALT down
        keybd_event(VkKeyScan('P'), 0, 0, 0);
        keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
        return 0;
    }

但它想将ALT + P发送到“打印”窗口,为什么? 最终目标是制作发送到应用程序keystorkes的小宏(在任何Windows子节点或父节点上) 操作系统:WIN 7 64位

1 个答案:

答案 0 :(得分:0)

您可以通过简单地删除这些行来使现有代码(类型)工作:

HWND handle1 = FindWindow(0, "Print");  // it wann't find "Print" window
SetForegroundWindow(handle1);

请记住,伪造的输入会转到具有输入焦点的线程,当您在记事本中显示打印对话框时,该对话框将获得输入焦点。您根本不需要设置焦点,系统会为您完成。

然而,你采取的方法非常脆弱。我怀疑使用像UI Automation这样的东西会更好。