gpt4 book ai didi

delphi - 使用 WinAPI 将击键发送到另一个应用程序

转载 作者:行者123 更新时间:2023-12-03 15:07:40 24 4
gpt4 key购买 nike

我必须通过向另一个应用程序发送击键来控制它,例如 CTRLSCTRLSHIFTCCTRLF

我已经尝试了很多方法,但我无法让它发挥作用。所以我试图在一个更简单的情况下解决这个问题。

这成功地将 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, WM_CHAR, dword('e'), 0);
SendMessage(edit, WM_CHAR, dword('y'), 0);
end;

这成功地将F5键发送到记事本,并且也适用于弹出“查找”对话框的F3

notepad := FindWindow('notepad', nil);
PostMessage(notepad, WM_KEYDOWN, VK_F5, 0);
PostMessage(notepad, WM_KEYUP, VK_F5, 0);

但我不知道为什么使用 SendMessage 不适用于上面的示例。

我能想到的最好的办法就是这样的东西,它什么也不做。

notepad := FindWindow('notepad', nil);
PostMessage(notepad, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(notepad, WM_KEYDOWN, VkKeyScan('F'), 0);
PostMessage(notepad, WM_KEYUP, VkKeyScan('F'), 0);
PostMessage(notepad, WM_KEYUP, VK_CONTROL, 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 版本中,Find21转到24

根据评论更新:如果需要发送Ctrl+Key,可以使用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));

关于delphi - 使用 WinAPI 将击键发送到另一个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com