Универсальный подход для отправки виртуальных кодов ключей с Delphi

Я пытаюсь написать международную программу, и мне нужно отправить какой-нибудь текст в "другие программы редактирования текста", такие как слово, блокнот или браузер. С другой стороны, я не уверен, что смогу найти международный выход (из-за разных раскладок клавиатуры)

было бы неплохо использовать код как ниже

SendMessage(FindActiveWindowsHWND,WM_SETTEXT,0,Integer(PChar('My String')));

и у меня нет функции, как FindActiveWindowsHWND

Изменить: код, который я пробовал, но пока не удовлетворен;

procedure FindActiveWindowsHWND();
var
 ThreadInfo: TGUIThreadInfo;
 activewindowsHwnd: HWND;
begin
  GetGUIThreadInfo(0,ThreadInfo);
  activewindowsHwnd:= ThreadInfo.hwndActive; (or ThreadInfo.hwndFocus);
end;

также я использовал функцию Sendinput, как это

procedure SendKey(vKey: SmallInt; booDown: boolean);
var
  GInput: array[0..0] of tagINPUT; //GENERALINPUT;
  // doesn't have to be array :)
begin
  GInput[0].Itype := INPUT_KEYBOARD;
  GInput[0].ki.wVk := vKey;
  GInput[0].ki.wScan := 0;
  GInput[0].ki.time := 0;
  GInput[0].ki.dwExtraInfo := 0;

  if not booDown then
    GInput[0].ki.dwFlags := KEYEVENTF_KEYUP
  else
    GInput[0].ki.dwFlags := 0;

  SendInput(1, GInput[0], SizeOf(GInput));
end;

затем

SendKey(65,true); //to send an "A" for example

но вместо этого он отправил "а", и когда я пытаюсь отправить "а" с помощью SendKey(97,true), он отправил "1". это действительно интересно, что я должен отправить клавишу Shift вниз, чтобы писать заглавные буквы

1 ответ

Ты можешь использовать GetGUIThreadInfo() чтобы получить HWND текущего сфокусированного окна в другом процессе. Не все типы окон принимают WM_SETTEXT, хоть. Вы могли бы использовать SendInput() чтобы поместить символы Unicode в очередь клавиатуры. Или используйте API автоматизации, как сказал Дэвид, хотя не все типы окон реализуют это.

Другие вопросы по тегам