Отправка нажатия клавиш в другое приложение с помощью WinAPI
Я должен контролировать другое приложение, отправляя нажатия на него, какCTRLS или жеCTRLСДВИГC или же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, 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.