300分,向其他程序发送中文字符,新手免进,我烦透了!!!(300分)

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

kingkong

Unregistered / Unconfirmed
GUEST, unregistred user!
老问题,最近做了一个自定义词组程序为的是自动向某个输入框发送字符串,其中
的核心函数是取得当前鼠标下的窗口句柄后向该窗口中拥有焦点的输入栏发送中文或
西文字符,在记事本下发送中文或西文均正常,但向IE,Word,Excel等发送
西文正常而中文却出现乱码,打开输入法后发送又正常了,不知是什么问题,
怎么解决?废话少说,不欢迎灌水!请发修改后的源程序,本人调试成功后立
即给分!!!!!!!

--------------第一种方法------------
这种方法在中文输入法打开的情况下中西文都正常,
但我不想用这种费事的办法.
------------------------------------
//模拟按键函数
procedure TForm1.SendKeys(sSend:string);
var
i:integer;
Sstr:string;
focushld,windowhld:hwnd;
threadld:dword;
ch: byte;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil);
AttachThreadInput(GetCurrentThreadId,threadld,true);
Focushld:=getfocus;
getcursorpos(p)
//查鼠标坐标
Focushld:=WindowFromPoint(p)
//返回句柄
AttachThreadInput(GetCurrentThreadId,threadld,false);
if (focushld=0) or
(focushld=Self.Memo1.Handle) or
(focushld=Self.Edit1.Handle) or
(focushld=Self.Edit2.Handle) or
(focushld=SpinEdit1.Handle) then
begin
Exit;
end;
i := 1;
while i <= Length(sSend) do
begin
ch := byte(sSend);
if Windows.IsDBCSLeadByte(ch) then
begin
Inc(i);
SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend), ch), 0);
end
else
begin
SendMessage(focushld, WM_IME_CHAR, word(ch), 0);
end;
Inc(i);
end;
SendMessage(focushld, WM_IME_CHAR, word(13), 0);
end;

//定时器定时发送字符
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SendKeys('ABCD1234大话西游');
end;



--------------第二种方法------------
这种方法用拷贝-粘贴的方式,在记事本下正常,
但在WORD下毫无反应!
------------------------------------
procedure TGoodDictForm.SendKey();
var
i:integer;
focushld,windowhld:hwnd;
threadld:dword;
ch: byte;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil);
AttachThreadInput(GetCurrentThreadId,threadld,true);
getcursorpos(p)
//查鼠标坐标
Focushld:=WindowFromPoint(p)
//返回句柄
AttachThreadInput(GetCurrentThreadId,threadld,false);
if (focushld=0) or (focushld=Self.Memo1.Handle) then
begin
Exit;
end;
SendMessage(focushld, WM_Paste, 0, 0);
end;

//定时器定时发送字符
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.SelectAll;
Edit1.CopyToClipboard;
SendKeys();
end;
 
我测试了第2种方法,确实在word不起作用,但是用word的粘贴菜单可以粘贴
进去,也就是说字符串已经在剪贴板里了,不知道word为什么不能贴。
帮你up
 
觉得应该用WM_COPYDATA消息,代码如下:
var
cdstr: TCopyDataStruct;
H:THandle;
s:string;
begin
s:=Edit1.text;
cdstr.dwdata:=111;
cdstr.cbdata:=length(s)+1;
GetMen(cdstr.lpdata,cdstr.cbdata);
StrCopy(cdstr.lpdata,PChar(s));
h:=findwindow('被查窗体类名','窗体名');
if h<>0 then
sendmessage(h,wm_copydata,0,0);
freemem(cdstr.lpdata);
另一程序使用GetWindowText接收数据
var
s:string;
begin
setLength(s,100);
getwindowtext(Msg.form,PChar(s),1000);
s:=PChar(s);
Edit1.caption:=PChar(Msg.Copydatastruct.lpdata);
end;
 
第一种方法在我这里没问题,我的输入法没打开也没有乱字符,我用的是Win2000
第二种方法在Word中不起作用我想可能是Word对粘贴消息进行了过滤
 
我是这么用的,借鉴一下
sendMessage(h,wm_setWindowtext,0,integer(pchar('字符串')));
 
乱码是Delphi控件的问题,你将Edit 换成RichEdit试试,不管在输入法打不打开的情况下,
都不会出现乱码.
至于不能在Word 中粘贴的问题,可能正如 碧血剑 大侠所说,我试过在 WordPad都能粘贴
的.
 
Word 的窗口结构比较复杂.
windowFromPoint 得到的是哪一层次的窗口,应该跟踪一下.
 
我写过oicq 消息攻击 的 东西,要吗,留个箱子!
 
rockjie: 我想你没明白我的意思,我要的是发送方是我的程序,而接收方是任意的,
比如word,excel,notepad等,如果两方都是我的程序就不用问大家了.
-----------------------------------------------
碧血剑: 你用word测试过吗?
---------------------------------------------
一少:你这种用法会使接收方的所有字符都变为发送方的,接收方原有字符不保留,这没有
实际意义,我要发送的同时接收方的内容仍然存在!!!
----------------------------------------------
DEN: 我用RichEdit替换了Edit依然不行,在word和wordpad中还是乱码,你真测试过吗?
我想没有.
----------------------------------------------
jsxjd: 你说的有些道理,问题是怎么跟踪,你能帮个忙吗?
----------------------------------------------
人在昆明:你做的程序能在word下正常发送中文吗,如能请发oldkill@sina.com,谢谢!!!


----------------------------
----------------------------
另外,各位大侠,这个问题是很有意思的,不过我希望大家没有测试过的方法就不要乱说了.
 
rokejie的方法是可行的.word的类名用api很容易得道的.这种方法并不一定要自己的
程序间才能用.
 
kingkong:
一样的,可以,只要找到那个 handle 就行啦。
 
闲话不聊了,发个例程最说明问题,谢过先.
 
什么时间发的,我没看见,痛苦的等待.............
 
不好意思,收是收到了,不过没用起,我大概找了一下,主要是
用 GetWindowText(hwnd,buffer1,100)找窗口,可是Word的句柄找到后怎么发送好象用
这个办法不可能成功,还有其他办法吗?
 
>>DEN: 我用RichEdit替换了Edit依然不行,在word和wordpad中还是乱码,你真测试过吗?
>>我想没有.
没测试过我是不会随便发言的.而且在RichEdit中同时打上繁体中简体都不会有问题.你再
看看吧.那不你给我邮件,我把截图给你.
Rain_Alinn@163.net
 
DEN:你是用我的代码测试,你试过将Word的字体设为其他字体的情况吗?
我的信箱是oldkill@sina.com,请发个截图looklook,谢谢.
 
Word和excel中我都试了,没问题
 
to DEN:首先感谢你发的程序,不过我只能在写字板(WordPad)和记事本中使用,在Word中没
有任何反应,我看了一下,SendMessage(focushld, WM_Paste, 0, 0)这句对Word没起任
何作用,正如前面jsxjd所说的"Word 的窗口结构比较复杂",或者粘贴命令被Word屏蔽了?
不知你在Word下测试了没?注意是Word,不是WordPad,另外请大家在测试时关闭中文输入
法.再次感谢大家,请各位帮忙帮到底,把这个问题解决了好吗?

kingkong痛苦的期待ing ....


 
To kingkong
要正確送出中文字符一定要依照微軟的IME機制, 單純用SendMessage
是不能夠的. 你可以把要送出的字符放在剪貼板中, 使用keybd_event
這個API送出 Ctrl 與 V 兩鍵的組合. 就能夠把中英文字串放到Word
等軟件中,
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(Ord('v'), 0, 0, 0);
keybd_event(Ord('v'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
 
后退
顶部