Question

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

No correct solution

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top