哪为兄弟能告诉我,当我在窗体创建是RegisterHotKey后,我隐藏了窗体,我想用一个热键呼出(比如F12),不知下面的代码该怎么写?望高手指点!
最后是否 还要unRegisterHotKey?
最后是否 还要unRegisterHotKey?
解决方案 »
- 谁给发一份Delphi2cs(Delphi代码转换到C#)
- 这是什么指令?{$IFDEF VER140};{$ENDIF}............
- 谁知道在dbgrideh中直接点击title就可按点击的那个字段排序的方法?不盛感激!
- 高程考试如有神助,散分庆祝!
- 求助!!!!!
- 一个很简单的问题
- 无法为更新行集定位:一些值可能已在最后读取后改变--怎么解决
- why "variable required?"
- 问题简单,得分多多!delphi如何调用c或c++的函数?
- 如何利用资源文件存取jpg格式文件
- 使用了托盘图标,在使用最小化后,再显示窗体出现问题,请问使用什么语句进行显示窗体好?
- 如何动态生成access数据库,最好有源码
全局热键
--------------------------------------------------------------------------------
在程序里定义热键,只能在自己的应用窗口范围内使用,受到一定的限制。如果能在自己的应用程序里定义能被所有窗口访问的热键,应该是比较具有现实意义的。要定义一个全局热键,通常有三个步骤:
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;