续:sendmessage向后台程序发送按键消息,如何发送组合按键,如ALT+E,谢谢了。 ( 积分: 100 )

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

zhenh

Unregistered / Unconfirmed
GUEST, unregistred user!
续:sendmessage向后台程序发送按键消息,如何发送组合按键,如ALT+E,谢谢了再给个例子。
 
sendmessage(YouHWnd,WM_KEYDOWN,VK_MENU,0);
sendmessage(YouHWnd,WM_KEYDOWN,DWORD('E'),0);
Application.ProcessMessage;
sendmessage(YouHWnd,WM_KEYUP,DWORD('E'),0);
sendmessage(YouHWnd,WM_KEYUP,VK_MENU,0);
 
不行,没反应,再帮我想想办法,或者还有没有别的可以操作后台窗口的???
 
不知道 ALT+E 发送给谁? 是 后台窗体还是Edit还是其他???
 
发给非活动的记事本窗体,让记事本弹出菜单(编辑)。
 
procedure TForm1.Button1Click(Sender: TObject);
var
WinHandle:HWND;
begin
WinHandle:= FindWindow(nil,Pchar('1.txt - 记事本'));
if WinHandle = 0 then ShowMessage('000');
SetForegroundWindow(WinHandle);
Keybd_Event(VK_MENU,0,0,0);
Keybd_Event(ord('E'),0,0,0);
Keybd_Event(ord('E'),0,keyeventf_keyup,0);
Keybd_Event(VK_MENU,0,keyeventf_keyup,0);
end;
 
这样也行
procedure TForm1.Button2Click(Sender: TObject);
var
WinHandle:HWND;
begin
WinHandle:= FindWindow(nil,Pchar('1.txt - 记事本'));
if WinHandle = 0 then ShowMessage('000');
AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(WinHandle,nil),True);
SetActiveWindow(WinHandle);
Keybd_Event(VK_MENU,0,0,0);
Keybd_Event(ord('E'),0,0,0);
Keybd_Event(ord('E'),0,keyeventf_keyup,0);
Keybd_Event(VK_MENU,0,keyeventf_keyup,0);
//SetActiveWindow(Handle);
AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(WinHandle,nil),False);
end;
 
就是说先把非活动窗口激活再操作是吗,那如果要保持非活动的状态可以作到吗???谢谢你了,你太利害了。
 
关键你是下拉菜单,如果你是向一个不活动的窗体的文本框里发送 ctrl+v组合键 , 根本就不需激活了.
 
恩,那要怎么作,不要菜单,但要组合键,麻烦你了。
 
你要发送 ALT+E 键 没办法 它是激活菜单 除非你发送别的 组合键
我要回家了 有什么问题 留言 回家我在给你弄
 
好的,谢谢你,就比如说CTRL+C呢,再给我个例子好吗。
 
那把上面的第二个改改 就可以了 ^-^
 
怎么改我不会,[:(]
 
晕 好吧 回家后我该你弄
 
呵呵,太谢谢你了

不过我真的是初学者,老是学不会。见笑了。
 
娃娃来了吗?麻烦你了。
 
兄弟 我发现不激活 还不行来 不过我以前弄过"向最小化的窗口中的Edit发送Ctrl + V 组合键" 实现过.

先这样了 不知道那为高手在来给看看
procedure TForm1.Button1Click(Sender: TObject);
var
WinHandle,EditHandle:HWND;
begin
// SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
WinHandle:= FindWindow(nil,Pchar('1.txt - 记事本'));
if WinHandle = 0 then ShowMessage('000');
AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(WinHandle,nil),True);
EditHandle:= GetWindow(WinHandle,GW_CHILD);
Windows.SetFocus(EditHandle);
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);
// SendMessage(WinHandle,WM_SYSCOMMAND,SC_ICON,0);
AttachThreadInput(GetCurrentThreadID,GetWindowThreadProcessID(WinHandle,nil),False);
SetForegroundWindow(Handle);
// SetWindowPos(Handle,0,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE OR SWP_NOZORDER);
end;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部