delphi – 使用WinAPI将键击发送到另一个应用程序
发布时间:2020-12-15 09:34:34 所属栏目:大数据 来源:网络整理
导读:我必须通过向CTRLS或CTRLSHIFTC或CTRLF发送击键来控制另一个应用程序. 我尝试了很多东西,但是我无法让它发挥作用.所以我试图在一个更简单的案例中做到这一点. 这成功地将Hey发送到记事本: procedure TForm1.Button1Click(Sender: TObject); var notepad,edi
我必须通过向CTRLS或CTRLSHIFTC或CTRLF发送击键来控制另一个应用程序.
我尝试了很多东西,但是我无法让它发挥作用.所以我试图在一个更简单的案例中做到这一点. 这成功地将Hey发送到记事本: procedure TForm1.Button1Click(Sender: TObject); var notepad,edit: HWND; begin notepad := FindWindow('notepad',nil); edit := FindWindowEx(notepad,FindWindow('Edit',nil),nil,nil); SendMessage(edit,WM_CHAR,dword('H'),0); SendMessage(edit,dword('e'),dword('y'),0); end; 这成功地将F5键发送到记事本,并且还可以使用F3弹出“查找”对话框. notepad := FindWindow('notepad',nil); PostMessage(notepad,WM_KEYDOWN,VK_F5,0); PostMessage(notepad,WM_KEYUP,0); 但我不知道为什么使用SendMessage不适用于上面的例子. 我能提出的最好的事情就是这样,什么都不做. notepad := FindWindow('notepad',VK_CONTROL,VkKeyScan('F'),0); 我在这里发现了一个库,它有点模仿VBScript发送键功能,但只是查看代码,它似乎只是向当前应用程序或所有应用程序广播键,因为没有Handle参数. 解决方法
警告:此方法取决于实现细节,如果您需要保证程序的正确性,则不应使用此方法. (另一方面,你已经在那条路上.例如,IIRC,在Windows 95中甚至没有Go to对话框.)
我在我最喜欢的资源编辑器中打开了notepad.exe,并调查了菜单栏.我注意到Save菜单项的ID是3.因此,以下代码在记事本中执行Save菜单命令: var notepad: HWND; begin notepad := FindWindow('notepad',nil); SendMessage(notepad,WM_COMMAND,3,0); 同样,在我的notepad.exe版本中查找是21.去是24. 根据评论更新:如果需要发送Ctrl键,可以使用SendInput: var notepad: HWND; inputArray: array[0..3] of TInput; begin notepad := FindWindow('notepad',nil); // TODO: Either exit if notepad isn't focused,or set focus to notepad FillChar(inputArray,length(inputArray) * sizeof(TInput),0); inputArray[0].Itype := INPUT_KEYBOARD; inputArray[0].ki.wVk := VK_LCONTROL; inputArray[1].Itype := INPUT_KEYBOARD; inputArray[1].ki.wVk := VkKeyScan('S'); inputArray[2].Itype := INPUT_KEYBOARD; inputArray[2].ki.wVk := VkKeyScan('S'); inputArray[2].ki.dwFlags := KEYEVENTF_KEYUP; inputArray[3].Itype := INPUT_KEYBOARD; inputArray[3].ki.wVk := VK_LCONTROL; inputArray[3].ki.dwFlags := KEYEVENTF_KEYUP; SendInput(length(inputArray),inputArray[0],sizeof(TInput)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |