문제

I am trying to write international program and need to send some text to "other text edit programs" like word or notepad or a browser. On the other hand I am not sure that I can find an international way(because of the different keyboard layouts)

it would be nice to use a code like below

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

and I dont have function like FindActiveWindowsHWND

Edit: The code I am tried but not satisfied so far;

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

also I used Sendinput function like this

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;

then

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

but instead it sent an "a" and when I try to send an "a" using SendKey(97,true) it sent "1". it is really interesting that I have to send shift key down to write uppercase letters

올바른 솔루션이 없습니다

다른 팁

You can use GetGUIThreadInfo() to get the HWND of the currently focused window in another process. Not all window types accept WM_SETTEXT, though. You could use SendInput() to put Unicode characters into the keyboard queue, though. Or use the Automation API, like David said, though not all window types implement that.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top