请问如何编程实现在其他应用程序窗口输出中文(必须是中文)?不能用剪贴板传送.(200分)

  • 主题发起人 主题发起人
  • 开始时间 开始时间

Unregistered / Unconfirmed
GUEST, unregistred user!
比如在记事本,WORD等窗口自动输出一些汉字.我知道用keybd_event可以模拟键盘输出字母,<br>数字,符号.但无法实现汉字的输出.请各位指点.
 
好象是这个<br>s:string;<br>SendMessage(Handle, WM_SETTEXT, 0, LongInt(lpstr(S)));<br>至于怎样得到Handle,就看你自己了
 
KENNY.HU:这样我曾试过,只能改变窗口的标题.
 
那是因为你使用的HANDLE是窗口的,他的编辑框的HANDLE 是不同的<br>你要设法取得编辑框的HANDLE
 
//为某个对象付值<br>Procedure TForm1.SetStrings();<br>var<br>&nbsp; tWnd,bWnd: HWND;<br>begin<br>&nbsp; &nbsp;tWnd :=0;<br>&nbsp; &nbsp;bWnd :=0;<br>&nbsp; &nbsp;//得到句柄<br>&nbsp; &nbsp;Twnd := FindWindow(nil,PChar(Trim(Edt_Object.Text)));<br>&nbsp; &nbsp;//得到子对象句柄<br>&nbsp; &nbsp;bWnd := FindWindowEx(TWnd,0,PChar(Trim(Edt_ZE.Text)),nil);<br><br>&nbsp; &nbsp;SendMessage(bWnd,WM_SETTEXT,0,LongInt(PChar(Trim(Edt_NR.text))));<br><br>end;
 
你们的办法我知道.可是都有局限性.因为我所要输出的窗口是用一个叫做NETTREM的TELNET程序远程连接到一台<br>UNIX主机,然后直接运行UNIX下的一个应用程序.再进行数据录入工作.所以只有输入焦点,没有<br>控件句柄.但窗口句柄是有的.就是NETTREM的窗口句柄.<br>用中文输入法可以输入中文.既然输入法能做到,那我想在程序中也一样可以做到.
 
做输入法,我有VC的代码!
 
procedure SendText(const h: HWND; const s: string); &nbsp;<br>var &nbsp;<br>i: integer; &nbsp;<br>begin &nbsp;<br>if h = 0 then &nbsp;<br>Exit; &nbsp;<br>if Length(s) = 0 then &nbsp;<br>Exit; &nbsp;<br>for i:= 1 to Length(s) do &nbsp;<br>begin &nbsp;<br>if Ord(s) in [9, 13, 32..254] then &nbsp;<br>SendMessage(h, WM_CHAR, Ord(s), 0); &nbsp;<br>end; &nbsp;<br>end;
 
这个思路是可以的,获取句柄,输出文字
 
http://www.2ccc.com/article.asp?articleid=942
 
没问题的呀,已经测试:<br>function GetComponentHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;<br>var<br>&nbsp; buffer: array[0..255] of Char;<br>begin<br>&nbsp; &nbsp; Result := True;<br>&nbsp; &nbsp; //得到目标窗口的控件<br>&nbsp; &nbsp; GetClassName(hwnd, buffer, 256);<br>&nbsp; &nbsp; //找到目标窗口的TButton类目标控件<br>&nbsp; &nbsp; if StrPas(Buffer)='TEdit' then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)<br>&nbsp; &nbsp; &nbsp; &nbsp; Result:=False; &nbsp;//终止循环<br>&nbsp; &nbsp; end;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; AHandle, BHandle: Integer;<br>&nbsp; S:String;<br>begin<br>&nbsp; &nbsp; //取句柄<br>&nbsp; &nbsp; AHandle := FindWindow(nil, '你的窗口'); &nbsp;//就是窗口的Caption<br>// &nbsp;AHandle := GetActiveWindow; //或GetForeGroundWindow;获得当前激活窗体的句柄<br>&nbsp; &nbsp; if AHandle&lt;&gt;0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; //在这里循环取到想要的句柄为止<br>&nbsp; &nbsp; &nbsp; &nbsp; EnumChildWindows(AHandle, @GetComponentHandle, Integer(@BHandle));<br>&nbsp; &nbsp; &nbsp; &nbsp; //此时,BHandle就是你要的句柄<br>&nbsp; &nbsp; &nbsp; &nbsp; S:='你好吗?OK吗?';<br>&nbsp; &nbsp; &nbsp; &nbsp; SendMessage(BHandle, WM_SETTEXT, 0, LongInt(lpstr(S)));<br>&nbsp; &nbsp; end;<br>end;<br>
 
用 SPY++ 分析一下你那个软件界面上的窗口,然后设法用 FindWindowEx 在程序里找到那个软件的命令输入窗口(文本框)就行了。
 
我这个基本解决了您的问题<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2570322
 
问题还没解决吗?应该解决了吧,该结帖了
 
后退
顶部