我按下面的介绍做后,热键无反应?请高手回答全局热键
2000-09-15 00:00:00· 吴中卫·yesky
--------------------------------------------------------------------------------
通常在自己的程序里定义热键,只能在自己的应用窗口范围内使用,未免使用起来受到一定的限制。
如果能在自己的应用程序里定义能被所有窗口访问的热键,应该是比较具有现实意义的。要定义一个全局热键,通常有三个步骤:
1。定义 Windows 的消息 WM_HOTKEY 的 HOOK 链,即 procedure myshortcut(var message: TMessage); message WM_HOTKEY;
2。向 Windows 加入一个全局原子 hotkey : GlobalAddAtom(’hotkey’), 并保留其句柄
3。向 Windows 登记热键链: RegisterHotKey( 应用句柄,全局原子句柄, mod_control ,88 );
其中,RegisterHotKey 函数原形如下
BOOL RegisterHotKey(
HWND hWnd, // 连接热键的窗口句柄
int id, // 全局原子句柄
UINT fsModifiers, // 热键修饰标志
UINT vk // 虚拟键盘码
);
这里,fsModifiers 是指虚拟键盘码 vk 结合何种键一起生成 WM_HOTKEY 的消息,它是下列三值的组合:
MOD_ALT // ALT 键必须按下
MOD_CONTROL // CTRL 键必须按下
MOD_SHIFT // SHIFT 键必须按下
有了这些准备,你就可以定义自己喜欢的方式了。下面是一个范例,当 CTRL + Q 在任何时候被按下时,都会打出 “你好,Crtl + Q 被按下” 的信息。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
procedure myshortcut(var message: TMessage); message WM_HOTKEY;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
id:Integer;
implementation
{$R *.DFM}
procedure TForm1.myshortcut(var message: TMessage);
begin
ShowMessage(’你好,Crtl + Q 被按下’);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
id:=GlobalAddAtom(’hotkey’);
RegisterHotKey(handle,id,mod_control,88);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id); //别忘了在退出时取消定义
end;
2000-09-15 00:00:00· 吴中卫·yesky
--------------------------------------------------------------------------------
通常在自己的程序里定义热键,只能在自己的应用窗口范围内使用,未免使用起来受到一定的限制。
如果能在自己的应用程序里定义能被所有窗口访问的热键,应该是比较具有现实意义的。要定义一个全局热键,通常有三个步骤:
1。定义 Windows 的消息 WM_HOTKEY 的 HOOK 链,即 procedure myshortcut(var message: TMessage); message WM_HOTKEY;
2。向 Windows 加入一个全局原子 hotkey : GlobalAddAtom(’hotkey’), 并保留其句柄
3。向 Windows 登记热键链: RegisterHotKey( 应用句柄,全局原子句柄, mod_control ,88 );
其中,RegisterHotKey 函数原形如下
BOOL RegisterHotKey(
HWND hWnd, // 连接热键的窗口句柄
int id, // 全局原子句柄
UINT fsModifiers, // 热键修饰标志
UINT vk // 虚拟键盘码
);
这里,fsModifiers 是指虚拟键盘码 vk 结合何种键一起生成 WM_HOTKEY 的消息,它是下列三值的组合:
MOD_ALT // ALT 键必须按下
MOD_CONTROL // CTRL 键必须按下
MOD_SHIFT // SHIFT 键必须按下
有了这些准备,你就可以定义自己喜欢的方式了。下面是一个范例,当 CTRL + Q 在任何时候被按下时,都会打出 “你好,Crtl + Q 被按下” 的信息。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
protected
procedure myshortcut(var message: TMessage); message WM_HOTKEY;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
id:Integer;
implementation
{$R *.DFM}
procedure TForm1.myshortcut(var message: TMessage);
begin
ShowMessage(’你好,Crtl + Q 被按下’);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
id:=GlobalAddAtom(’hotkey’);
RegisterHotKey(handle,id,mod_control,88);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id); //别忘了在退出时取消定义
end;
解决方案 »
- wealsh 屏幕录像网络专业版
- c/s实现远程数据访问
- 再请教一个问题,如果修改一个十六进制文件?
- 高兴,终于和最心爱的MM在一起了,散分。春节快乐。
- 要在Delphi中实现类似于HTML中的OnMouseOver、OnMouseOut事件该如何办?
- 请问一个简单问题!40分
- 谁知道哪有关于ExpressQuantumGrid控件集用法的介绍?
- delphi 的 try...finally 是不是有问题?
- 需求: Windows優化大師的注冊碼?
- 我有一个能将Dbgrid数据输出到 Excel的控件,有意者请进来。。。
- win2000下的打印机自定义纸张
- 使用direct show进行摄像头图像的采集,如何录制一段图像
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
procedure QMessage(var Sender: TMessage);
message WM_HOTKEY;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle,1,MOD_CONTROL,81);/////// 81 不是 88
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterHotKey(handle,1);
end;procedure TForm1.QMessage(var Sender: TMessage);
begin
ShowMessage('你好,Crtl + Q 被按下');
end;end.
begin
ShowMessage(’你好,Crtl + Q 被按下’);
end;你好象写的不对
看我的:
procedure TForm1.myshortcut(var message: TMessage);
begin
if (msg.LParamHi = MOD_CONTROL ) and (msg.LParamLo = $51) then
begin
ShowMessage(’你好,Crtl + Q 被按下’);
end;
end;$51 为 Q 键