模拟按键

mlcht 2009-06-02 05:40:53
如何向一个窗体发送组合键CTRL+P,这个窗体有可能不在最前,也有可能最小化了,keybd_event好像不行
...全文
398 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
duduxia 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 b43ok 的回复:]
Delphi(Pascal) code
var
wnd:hwnd;
procedure TForm1.Button1Click(Sender: TObject);
var
ScanCode : Word;
lParam, Oem: longint;
begin
//按CTRL
ScanCode:= MapVirtualKey($11, 0);
lParam:= longint(ScanCode) shl 16 or 1;
SendMessage(wnd, WM_KEYDOWN, $11, lParam);
//按CTRL+P
Oem:= OemKeyScan(ord('P'));
ScanCode:= Oem and $000000FF or $FF00;//从OemKey提取0000XX00做ScanCode,…
[/Quote]
wnd为0没有效果。
不过还是收藏了。
thicklong 2009-07-02
  • 打赏
  • 举报
回复
用五楼的方法,注册全局热键.
b43ok 2009-06-12
  • 打赏
  • 举报
回复
忘了说明,就是发送带CTRL的键时,如果设置过错误的参数,可能会影响后续测试
我的机器上就遇到过这样的现象,不知道是不是个别现象
所以,在测试代码时如果无效,最好是重启后再测试
b43ok 2009-06-12
  • 打赏
  • 举报
回复

var
wnd:hwnd;
procedure TForm1.Button1Click(Sender: TObject);
var
ScanCode : Word;
lParam, Oem: longint;
begin
//按CTRL
ScanCode:= MapVirtualKey($11, 0);
lParam:= longint(ScanCode) shl 16 or 1;
SendMessage(wnd, WM_KEYDOWN, $11, lParam);
//按CTRL+P
Oem:= OemKeyScan(ord('P'));
ScanCode:= Oem and $000000FF or $FF00;//从OemKey提取0000XX00做ScanCode,这步估计难倒不少人,国内更没这方面资料,感慨一下
lParam:= longint(ScanCode) shl 16 or 1;//按MSDN上的说明,把它放到16bit的位置去,然后or 1设置只发送一次
SendMessage(wnd, WM_KEYDOWN, ord(Key), lParam);
SendMessage(wnd, WM_CHAR, ord(Key), lParam);
//松开CTRL+P
lParam:= lParam or $C0000000;//松开CTRL
SendMessage(wnd, WM_KEYUP, ord(Key), lParam);
//松开CTRL
ScanCode:= MapVirtualKey($11, 0);
lParam:= longint(ScanCode) shl 16 or 1;
lParam:= lParam or $C0000000;
SendMessage(wnd, WM_KEYDOWN, $11, lParam);
//打完收功!
end;

楼主是不是要考虑加点分 ^_^
b43ok 2009-06-12
  • 打赏
  • 举报
回复
SendMessage可以发Ctrl+P,
刚回来看了一下,这贴到现在还没人给答案,于是对自己的代码也没信心了,
于是又测试了一下,实践证明,WM_KEYDOWN完全可以做到
mlcht 2009-06-09
  • 打赏
  • 举报
回复
to mwy654321
谢谢,CTRL+P确实不是全局热键,是个快捷键,执行了一个函数,这个调用功能已经实现。

但是我想消息应该可以实现所有的事件操作吧,不可能发送消息实现不了一个组合按键。

【草原之魂】给出的参数说明只有ALT+字母的组合键可以实现,我估计还是传递的参数有问题,哪位达人能再具体一下。本来以为问题很简单,现在发现这个消息有些复杂。我去加分,希望大家帮顶,到解决为止。
mlcht 2009-06-08
  • 打赏
  • 举报
回复
大家只是讨论一下么,有好的解决方法说一下。
无条件为你 2009-06-08
  • 打赏
  • 举报
回复
你要的功能不一定好实现,但可以变通实现。

如果原程序不处于当前活动状态,那么CTRL+p键并不能被原程序接受。除非CTRL+p是全局的(不过可能性较小)。

CTRL+P如果是原程序的一个菜单的快捷键,可以尝试进行模拟菜单输入。无论是最小化还是隐藏了或是被其它窗口挡住,都可以实现。于是你的问题解决了。
mlcht 2009-06-08
  • 打赏
  • 举报
回复
up
b43ok 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kill211 的回复:]
不是活动的窗口是不能接收按键消息的
[/Quote]

涨见识了……
不知道我做的后台WG是怎么实现的,原来我一直用的不是消息……
duduxia 2009-06-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kill211 的回复:]
不是活动的窗口是不能接收按键消息的
[/Quote]
楼上发言有见识啊。
kill211 2009-06-06
  • 打赏
  • 举报
回复
不是活动的窗口是不能接收按键消息的
yshuui 2009-06-05
  • 打赏
  • 举报
回复
我不知道有其它的办法,起码我原来没做成,查了很多资料也不行。
mlcht 2009-06-05
  • 打赏
  • 举报
回复
但是窗体最小化的时候你设置最前,再给焦点模拟按键,这样突然弹出会影响用户的,没有其他解决办法么
yshuui 2009-06-04
  • 打赏
  • 举报
回复
SendMessage发送不了组合键,只能使窗体最前,模拟按键。
de410 2009-06-03
  • 打赏
  • 举报
回复

测试通过~~
procedure TForm1.Button2Click(Sender: TObject);
var
KeyState: TKeyboardState;
begin
GetKeyboardState(KeyState);
KeyState[VK_CONTROL]:=not KeyState[VK_CONTROL];//ctrl->down
SetKeyboardState(KeyState);
SendMessage(edit1.Handle,WM_KEYDOWN,WPARAM('P'),0);
GetKeyboardState(KeyState);
KeyState[VK_CONTROL]:=not KeyState[VK_CONTROL];//ctrl->up
SetKeyboardState(KeyState);
end;
mlcht 2009-06-03
  • 打赏
  • 举报
回复
SendMessage(edit1.handle, WM_SYSKEYDOWN, VK_CONTROL, $20380001);//首先 发送了一个Ctrl按下
SendMessage(edit1.handle, WM_SYSKEYDOWN, 80, $20210001);//然后发送了一个'P'键
SendMessage(edit1.handle, $106, 80, $20210001);// 然后发送了一个字符'p'
SendMessage(edit1.handle, $105, VK_CONTROL, $C0380001);//最后抬起按键CTRL键

显示同时按下的是ALT。。。
mlcht 2009-06-03
  • 打赏
  • 举报
回复
TO 草原之魂
SendMessage(edit1.handle, WM_SYSKEYDOWN, VK_CONTROL, $20380001);//首先 发送了一个Ctrl按下
SendMessage(edit1.handle, WM_SYSKEYDOWN, 80, $20210001);//然后发送了一个'P'键
SendMessage(edit1.handle, 106, 80, $20210001);// 然后发送了一个字符'p'
SendMessage(edit1.handle, 105, VK_CONTROL, $C0380001);//最后抬起按键CTRL键
这个是ALT+P,查了下资料和你说的一样,但是我测试程序这样发送消息,只有ALT响应,CTRL,SHIFT没有反应
mlcht 2009-06-03
  • 打赏
  • 举报
回复
呵呵,你肯定是在同一进程下,我是要操作其他进程的窗体,那个窗体还有可能最小化了,SetKeyboardState只能设置当前进程的按键状态。

谢谢,还有别的方法么?
你开始给的SendMessage参数我怎么调试都只有ALT可行,CTRL和SHIFT都不会出现按下状态
AuroraAlpha 2009-06-02
  • 打赏
  • 举报
回复
用WinIO直接操作键盘
加载更多回复(1)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧