我写的手写程序是用的鼠标钩子,用钩子返回需要手写的窗口的句柄。比如:我要在记事本中用手写输入,我用鼠标在记事本里面点击一下,然后,HOOK程序就把记事本所有的输入窗口的句柄返回给手写程序,然后,在手写程序上面手写字符,用SENDMESSAGE发送消息到记事本的输入窗口,这一步都是完整的实现了,在一般的窗口输入,都没得问题,在QQ窗口输入也没有问题,现在的问题是不能在WORD 正文里面输入字符,在WORD的某些窗口是可以手写输入的,就是不能在正文输入,在网上找了N久,都没有找到相关的资料,请朋友们帮帮忙。看看是不是我哪里的逻辑有问题,或者朋友们帮我给个思路看看。在此,先谢谢了。
现在我把所有的分数都给出。正好100分。谢谢各位了。

解决方案 »

  1.   

    我感觉你操作word,是不是要使用ole对象的方式好一点呢????
    ole方式,输入正文内容肯定是没问题的。。
    希望对你有帮助。
      

  2.   

    不要用钩子,直接取用GetForegRoundWindow取到句柄发送,很简单的事,在玉米群里面说吧。
      

  3.   

    GetForegRoundWindow
    这个并不能精确取到某一个窗口的。呵呵。
    只能取得最前台的窗口的句柄的。
      

  4.   

    发送字符
    1.对不同的WinControl采用不同的方法,或者利用GetActiveOleObject
    2.通用的办法
    procedure SendkeyInput(keys:string);//SendInput
    procedure IOKeysPress(KeysString:string);//WINIO
    procedure SendKeysMsg(h:hwnd;s:string);//wm_char
    function SendKeys(SendKeysString:PChar;Wait:Boolean):Boolean;//keybd_event
    当然还有NTIO和驱动我没实现
    推荐你用
    procedure SendKeysMsg(h:hwnd;s:string);
    var
      i:integer;
      ch:byte;
    begin
      if h=0 then Exit;
      i:=1;
      while i<=Length(s) do
      begin
        ch:=byte(s[i]);
        if IsDBCSLeadByte(ch) then
        begin
          Inc(i);
          SendMessage(h,WM_IME_CHAR,MakeWord(Byte(s[i]),ch),0);
        end
        else SendMessage(h,WM_IME_CHAR,word(ch),0);
        Inc(i);
      end;
    end;