怎么给一个运行中的程序模拟按键啊?

晨池 2005-01-16 04:40:13
就是模拟按键了,像按键精灵一样。
先谢谢大家
...全文
510 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨池 2005-03-20
  • 打赏
  • 举报
回复
谢谢大家!
zhaoyu_me 2005-02-22
  • 打赏
  • 举报
回复
postmessage就可以了阿,这个是模拟向foobar2000按键(foobar2000在后台运行)
procedure TForm1.ONHotkey(var message:Tmessage);
begin
wnd:=findwindow('{DA7CD0DE-1602-45e6-89A1-C2CA151E008E}',nil);
if (message.WParam=WM_SNAPHOTKEY) then
postmessage(wnd,WM_keydown,ord('X'),0);
if (message.WParam=WM_SNAPHOTKEY1) then
postmessage(wnd,WM_keydown,109,0);
if (message.WParam=WM_SNAPHOTKEY2) then
postmessage(wnd,WM_keydown,107,0);
if (message.WParam=WM_SNAPHOTKEY3) then
postmessage(wnd,WM_keydown,ord('V'),0); //home
if (message.WParam=WM_SNAPHOTKEY4) then
postmessage(wnd,WM_keydown,ord('B'),0);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
RegisterHotKey(Handle,WM_SNAPHOTKEY1,0,36 );
RegisterHotKey(Handle,WM_SNAPHOTKEY2,0,35 );
RegisterHotKey(Handle,WM_SNAPHOTKEY,0,VK_f10 );
RegisterHotKey(Handle,WM_SNAPHOTKEY3,0,VK_f7 );
RegisterHotKey(Handle,WM_SNAPHOTKEY4,0,VK_f8 );
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnregisterHotKey(Handle,WM_SNAPHOTKEY);
UnregisterHotKey(Handle,WM_SNAPHOTKEY1);
UnregisterHotKey(Handle,WM_SNAPHOTKEY2);
UnregisterHotKey(Handle,WM_SNAPHOTKEY3);
UnregisterHotKey(Handle,WM_SNAPHOTKEY4);
end;
kuki84 2005-02-21
  • 打赏
  • 举报
回复
procedure TForm1.Button2Click(Sender: TObject);
var
handle1:HWND;
winrect:Trect;
NPoint:TPoint;
begin
edit1.SelectAll;
Clipboard.SetTextBuf(pchar(edit1.Text));// 剪切话语内容至剪切板
handle1:= FindWindow(nil,'MU'); //查找MU窗口句柄
if handle1=0 then
begin
showmessage('MU未启动,请重试。');
exit;
end;
GetWindowRect(Handle1, WinRect); //获得窗口范围
GetcursorPos(NPoint); //获得当前窗口坐标
SetForegroundWindow(handle1); //MU窗口前置,以防被遮挡
SetCursorPos(winrect.Left+50,winrect.Top+50); //鼠标指针置于MU画面上
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0) ;
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0) ; //模拟在MU画面点击,以获得焦点

keybd_event(13,0,0,0);
keybd_event(13,0,KEYEVENTF_KEYUP,0); //回车

keybd_event(VK_CONTROL,0,0,0);
keybd_event(86,0,0,0);
keybd_event(86,0,KEYEVENTF_KEYUP,0); //粘贴
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

keybd_event(13,0,0,0);
keybd_event(13,0,KEYEVENTF_KEYUP,0); //回车


SetCursorPos(Npoint.X,Npoint.y-23);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0) ;
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0) ;
SetCursorPos(Npoint.X,Npoint.y); //鼠标归位
end;
晨池 2005-01-17
  • 打赏
  • 举报
回复
FindWindowEx 就可以找出来所有的窗口的句柄……原来这么简单……不好意思,我是菜鸟

问题是有些是通过自己定义的消息的,那么发送消息给对应的窗口就不太现实了,又该怎么办呢?
eedragon 2005-01-17
  • 打赏
  • 举报
回复
有意思
gz
晨池 2005-01-17
  • 打赏
  • 举报
回复
我试了下,用Spy++找到窗口的句柄,然后发送消息。
对于记事本,用WM_Char,发送给类名为Edit的窗口,可以实现;但是对计算器,无论是WM_Char还是WM_KeyUp WM_KeyDown都不可以。后来用Spy++查看它的Edit的窗口的消息的时候,发现居然有一个似乎是自定义的消息,而且有很多消息,好象是7条吧,我把Spy++截获的消息原样发送给它的Edit窗口都不可以,不知道为什么,当然那个自定义的消息我不知道是什么就没发送……

好象有些软件,必须把消息发送给它的特定的子窗口才会有反映,是不是这样呢?
又怎么获得所有的窗口的句柄呢?不用Spy++,而是在自己的程序里实现?
jackie168 2005-01-17
  • 打赏
  • 举报
回复
我看到的都是给当前窗口发送消息实现模拟按键的,但是怎么做到给非当前窗口模拟按键呢?
==================================================================================

>>>首先获取它的句柄,然后给它发消息~~
晨池 2005-01-16
  • 打赏
  • 举报
回复
我看到的都是给当前窗口发送消息实现模拟按键的,但是怎么做到给非当前窗口模拟按键呢?
我同学在一台电脑上挂机网游,用了“按键精灵”模拟按键挂机。问题是必须把网游设置成当前的窗口(那个游戏当然是全屏了!),我想如果可以同时切换出去上网,岂不很爽?!
所以,呵呵,就想,怎么能给非当前窗口也模拟按键呢?
按键精灵说它可以给非当前窗口模拟按键,其实不能。

还有种方法是把非当前窗口设置成当前窗口再模拟,这个方法……我也有这样的思路,但是,显然太影响上网了
Kshape 2005-01-16
  • 打赏
  • 举报
回复
模拟按键?
没用过那个按键精灵!

你需要他按下,你就发个消息就可以了啊
gxgyj 2005-01-16
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3679/3679611.xml?temp=.9698603
gxgyj 2005-01-16
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3605/3605201.xml?temp=.1142694

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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