本人想向莫一个窗体发送一个组合键消息,如Alt+A,可光标的焦点不一定在这个窗体上!
如果光标在我要发送的窗体上,可以:
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0), 0,0);
keybd_event(byte('A'), MapVirtualKey(byte('A'),0), 0,0);
keybd_event(byte('A'),MapVirtualKey(byte('A'),0), KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);
若光标不在,不知道如何实现!
不知道能不能通过sendmessage或postmessage来实现!
多多指点,小弟在此谢过了!
如果光标在我要发送的窗体上,可以:
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0), 0,0);
keybd_event(byte('A'), MapVirtualKey(byte('A'),0), 0,0);
keybd_event(byte('A'),MapVirtualKey(byte('A'),0), KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);
若光标不在,不知道如何实现!
不知道能不能通过sendmessage或postmessage来实现!
多多指点,小弟在此谢过了!
接受按键消息的窗体代码如下,主要是注册一个hotkey来相应操作unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
hotkeyid :integer;
procedure WMhotkeyhandle(var msg:Tmessage);
message wm_hotkey; end;var
Form1: TForm1;implementation{$R *.DFM}
procedure TForm1.Wmhotkeyhandle
(var msg:Tmessage);
begin
//热键的处理消息
if (msg.LParamHi=$41) and
(msg.lparamLo=MOD_CONTROL or mod_Alt) then
begin
//在这里做你需要的操作
msg.Result:=1;
application.BringToFront;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//注册热键,这里通过在原子表中添加一项来保证hotkeyid
//热键为ctrl+alt+a
hotkeyid:=GlobalAddAtom(pchar('UserDefineHotKey'))-$C000;
registerhotkey(handle,hotkeyid,MOD_CONTROL or mod_Alt,$41);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
unregisterhotkey(handle,hotkeyid);
DeleteAtom(HotKeyID);
end;end.在另外新建立一个工程,放一个按钮,代码如下
procedure TForm1.Button1Click(Sender: TObject);
var
hd : THandle;
begin
hd := FindWindow(nil,'Form1');//判断那个接受消息的窗体是否存在
if hd <> 0 then
begin
//按照你的思路,模拟按下ctr+alt+a
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0), 0,0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0), 0,0);
keybd_event(byte('A'), MapVirtualKey(byte('A'),0), 0,0);
keybd_event(byte('A'),MapVirtualKey(byte('A'),0), KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);
end;
end;以上程序,winxp+d7下测试通过。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,MMSystem;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
//处理 WM_HOTKEY 事件
procedure WmHotKey(var msg:TMessage); message WM_HOTKEY;
public
{ Public declarations }
end;var
Form1: TForm1;const
MY_HOTKEY: Integer = $0001; //HotKey ID
ALT_F3 :Integer =$0002;
E :integer =$0003;
L :integer =$0004;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
//使用前必须先注册热键
if not RegisterHotKey(Self.Handle,MY_HOTKEY,0,VK_F3) then
MessageDlg('注册热键失败',mtError,[mbOk],0); if not RegisterHotKey(Self.Handle,ALT_F3,MOD_ALT,VK_F3) then
MessageDlg('注册热键失败',mtError,[mbOk],0); if not RegisterHotKey(Self.Handle,E,0,VK_F7) then
MessageDlg('注册热键失败',mtError,[mbOk],0);
if not RegisterHotKey(Self.Handle,L,0,VK_F8) then
MessageDlg('注册热键失败',mtError,[mbOk],0);end;procedure TForm1.FormDestroy(Sender: TObject);
begin
//退出时撤销已经注册的热键
if not UnRegisterHotKey(Self.Handle,MY_HOTKEY) then
MessageDlg('撤销热键失败',mtError,[mbOk],0);
if not UnRegisterHotKey(Self.Handle,ALT_F3) then
MessageDlg('撤销热键失败',mtError,[mbOk],0);
if not UnRegisterHotKey(Self.Handle,E) then
MessageDlg('撤销热键失败',mtError,[mbOk],0);
if not UnRegisterHotKey(Self.Handle,L) then
MessageDlg('撤销热键失败',mtError,[mbOk],0);end;procedure TForm1.WmHotKey(var msg: TMessage);
begin
//热键激活的代码
{ if msg.WParam = MY_HOTKEY then MessageDlg('got the f3 message',mtInformation,[mbOk],0)
else if msg.WParam = ALT_F3 then MessageDlg('got the alt + f3hotkey message',mtInformation,[mbOk],0);
}
if msg.WParam = MY_HOTKEY then WindowState:=wsMaximized
else if msg.WParam = ALT_F3 then WindowState:=wsNormal
else if msg.WParam = E then mciSendString('set cdaudio door open wait',0,0,0)
else if msg.WParam = L then mciSendString('set cdaudio door closed wait',0,0,0);end;end.