100分问:向其它程序窗口的控件发送ctrl+任意热键出现的问题/另外程序多个实例怎么区分.

aoan 2004-11-10 07:07:37
火爆:★★送100分.★★晕哦,只能送100分啊,
好的我想法再送.多谢了.
//问题一.向其它程序窗口的控件发送ctrl+任意热键出现的问题

写了一个向别的程序的TEdit控件发送消息的程序,但是不好用,句柄什么的都没问题.

可以取到该TEdit控件中的文字,但是用如下代码发送ctrl+H信息或ctrl+任意键信息都无效.

代码如下:
SendMessage(SendWnd,WM_KEYDOWN,VK_CONTROL,0);
SendMessage(SendWnd,WM_KEYDOWN,Ord('H'),0);
SendMessage(SendWnd,WM_KEYUP,Ord('H'),0);
SendMessage(SendWnd,WM_KEYUP,VK_CONTROL,0);
不知道是什么问题,但是模拟单一的键盘消息就OK了,当然F1-F12也OK,郁闷死我了.

前面的Api调用,我用过SendMessage和PostMessage,都无效.

另外,发送文本到其它窗口控件后,要加入回车.回车总是在消息前面发到是为什么.
SendMessage(hWnd,WM_SETTEXT,0,Buf);
SendMessage(Hwnd,WM_KeyDown,Vk_Return,0);

//问题二.另外程序多个实例怎么区分.
我写的程序向另外那个程序发送消息,但是外部程序是可以运行多个实例的

怎么根据类列出这几个实例句柄和ID.

在这里谢谢各位大虾了.如果方便的话帮忙举个小例子.
...全文
126 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hottey 2004-11-10
  • 打赏
  • 举报
回复
SetForegroundWindow设置为当前焦点窗口,对隐藏窗口也是有效的吧^_^
aoan 2004-11-10
  • 打赏
  • 举报
回复
三楼,
你的方法我这就去试,我编的程序是要向后台程序发送
keybd_event好像只能发送到当前焦点的程序,
后台程序有时候窗口是隐藏的,好像还得用句柄方式发送.
longtusoft 2004-11-10
  • 打赏
  • 举报
回复
1.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);
2.用FINDWINDOW取得窗口名,发现有此窗口即为有实例在运行.
hottey 2004-11-10
  • 打赏
  • 举报
回复
另外,发送文本到其它窗口控件后,要加入回车.回车总是在消息前面发到是为什么.
SendMessage(hWnd,WM_SETTEXT,0,Buf);
SendMessage(Hwnd,WM_KeyDown,Vk_Return,0);

我不知道是什么意思,你用我上面的方法发送文本到其他控件上是没有问题的。

//问题二.另外程序多个实例怎么区分.
我写的程序向另外那个程序发送消息,但是外部程序是可以运行多个实例的

怎么根据类列出这几个实例句柄和ID

》》你是想向寻程序的所有实例窗口都发吗?
var
hd:HWnd;
name: PChar;
l: integer;
begin
hd:=GetWindow(Handle,GW_HWNDFIRST);
while hd<>0 do
begin
l := GetWindowTextLength(hd) + 1;
GetMem(Name, l);
GetWindowText(hd, name, l);
if name = 'Form1' then
ShowMessage('g'); //你的操作
FreeMem(name);
hd := GetWindow(hd,GW_HWNDNEXT);
end;
end;
hottey 2004-11-10
  • 打赏
  • 举报
回复
第一个问题,向EDIT发送组合键:(我的方法)
procedure TForm1.Edit1Click(Sender: TObject);
var
P: TPoint;
Rect: TRect;
begin
GetCursorPos(P); //保存现在的位置
GetWindowRect(Edit1.Handle, Rect);
SetCursorPos(Rect.Left, Rect.Top); //定位到Edit1上
keybd_event(VK_CONTROL,0,0,0);
keybd_event(Ord('V'),0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(Ord('V'),0,KEYEVENTF_KEYUP,0);
SetCursorPos(P.X, P.Y); //还原位置
end;

你可以先复制一些文本,点击Edit时会发送Ctrl+V复制上去!
zwb666 2004-11-10
  • 打赏
  • 举报
回复
ding
相关推荐
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-11-10 07:07
社区公告
暂无公告