就是类似于VB中SendKeys的东西,往当前激活的应用程序发送一串字符串(类似于虚拟键盘消息)
DDG上面有个用Delphi实现SendKeys的例子,但那个不支持双字节。
我研究了一下源码,发现那个似乎是把那串字符最后还是翻译成了WM_KeyDown之类的消息,这样当然没办法支持双字节。而输入法之类的东西总有办法的吧?比如智能ABC,不就是一次把你输好的一串文字发给窗体的吗?
有没有人知道这个东西怎么做?

解决方案 »

  1.   

    first get the focus 
        
    handle
      

  2.   

    测试通过:
    function GetFocusedWindowFromParent(ParentWnd:HWnd):HWnd;
    var
      OtherThread,
      Buffer : DWord;
      idCurrThread: DWord;
    begin
      OtherThread := GetWindowThreadProcessID(ParentWnd, @Buffer);
      idCurrThread := GetCurrentThreadID;
      if AttachThreadInput(idCurrThread, OtherThread, true) then begin
      Result := GetFocus;
      AttachThreadInput(idCurrThread, OtherThread, false);
      end
      else
      Result:= GetFocus;
    end;//获得当前获得焦点的子窗体,即使它是其他应用程序的窗体
    function GetFocusedChildWindow: HWnd;
    begin
      Result := GetFocusedWindowFromParent(GetForegroundWindow);
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
    h:thandle;
    begin
     h:= GetFocusedChildWindow;
     sendmessage(h,WM_SETTEXT,Length(edit1.text), LongInt(PChar(Trim(edit1.text))));end;
      

  3.   

    谢谢del_c_sharp
    不过后面我觉得用WM_IME_CHAR比用WM_SetText要好:)
      

  4.   

    我最后使用的代码:function GetActiveControl(ParentWnd: HWND): HWND;
    var
      OtherThread,
      Buffer: DWord;
      idCurrThread: DWord;
    begin
      OtherThread:= GetWindowThreadProcessID(ParentWnd, @Buffer);
      idCurrThread:= GetCurrentThreadID;
      if AttachThreadInput(idCurrThread, OtherThread, True) then
       begin
         Result:= GetFocus;
         AttachThreadInput(idCurrThread, OtherThread, False);
       end
      else
        Result:= GetFocus;
    end;procedure SendKeys (S: string);
    const
      SleepTime = 50;
    var
      Handle: HWND;
      L, I: Integer;
      Char: Integer;
    begin   
      Sleep (SleepTime);
      Handle:= GetActiveControl(GetForegroundWindow);
      L:= Length(S);
      I:= 0;
      while I<L do
       begin
         Inc (I);
         Char:= Byte(S[I]);
         if (Char>127) and (I<L) then
          begin
            Inc (I);
            Char:= Char shl 8;
            Inc (Char, Byte(S[I]));
          end;
         case Char of
           10, 13:
            begin
              keybd_event (vk_Return, 0, 0, 0);
              keybd_event (vk_Return, 0, KEYEVENTF_KEYUP, 0);
              Sleep (SleepTime);
              Handle:= GetActiveControl(GetForegroundWindow);
            end;
           9:
            begin
              keybd_event (vk_Tab, 0, 0, 0);
              keybd_event (vk_Tab, 0, KEYEVENTF_KEYUP, 0);
              Sleep (SleepTime);
              Handle:= GetActiveControl(GetForegroundWindow);
            end;
           else
             SendMessage (Handle, WM_IME_Char, Char, 1);
         end;
       end;
    end;