【发布时间】:2015-02-02 10:22:47
【问题描述】:
我正在尝试远程控制应用程序。 特别是我尝试将功能键 F5 发送到 notepad.exe。
F5 上的notepad.exe 通常通过在其编辑区域粘贴实际时间/日期来做出反应。
到目前为止我已经弄清楚的代码:
/********************************************************************/
org = GetActiveWindow(); // get current active window
ShowWindow(w, SW_RESTORE); // do the switch to the notepad window
PostMessage(w, WM_KEYDOWN, VK_F5, 0); // send/post F5
Sleep(100); // need this to wait for the notepad action to complete
ShowWindow(org, SW_SHOW); // restore org window
/********************************************************************/
到目前为止,代码或多或少都能正常工作。
剩下的问题是使用Sleep() 需要等待多长时间,多少毫秒就足够了?
等待short会在notepad.exe完成F5任务之前切换回原来的窗口。
notepad.exe 将失去焦点,F5 命令将丢失,因为只有一个有焦点的记事本会处理它。
使用SendMessage() 会更好,因为它会等待完成
/********************************************************************/
SendMessage(w, WM_KEYDOWN, VK_F5, 0); // should sync on the completion of F5
/********************************************************************/
不幸的是,notepad.exe 在使用 SendMessage 而不是 PostMessage 时对 F5 没有反应。
有没有一种简洁的方法来同步所需的任务?
注意实际上notepad.exe只是一个更复杂的远程控制任务的例子。
【问题讨论】:
-
使用官方自动化 API UI Automation 来自动化应用程序
-
不可能猜到 GetActiveWindow() 应该完成什么,它只返回 your 应用程序的活动窗口,从不返回另一个进程。也很不清楚
w和org应该如何相关。这不能按预期工作。在尝试与其他应用混在一起之前,专注于编写自己的应用程序,这是充分了解 winapi 的好方法。 -
更好地使用
SendInput。 -
嗨,Hans,w 当然是记事本的窗口句柄,而 org 是我正在编写的 c++ 程序窗口的窗口句柄。
-
您好 Werner,据我了解,SendInput 只会导致 SendMessage WM_KEYDOWN 和 WM_KEYUP 消息。记事本不会对此做出反应。这适用于在编辑区域输入简单字符,不适用于执行 F5 等命令。
标签: c++ windows winapi sendmessage