请问如何在窗体重创建自己的快捷键

数字蛋糕 2002-05-12 08:05:44
我要做一个非可视控件,要求能够相应他所在的Form的F12键的按下事件,然后弹出一个对话框.

怎么实现这个控件?需要拦截那些事件?或者是要注册AccelerateTable?
...全文
87 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
数字蛋糕 2002-05-25
  • 打赏
  • 举报
回复
至于怎么创建非可视控件的消息循环,大家可以看看Timer的源代码就明白了.
很简单的.
数字蛋糕 2002-05-25
  • 打赏
  • 举报
回复
原先我也是使用你说的方法,可是如果在控件中的话,必须要将窗体子类化以截取WM_HOTKEY消息.作为控件来说这样一来问题就多多.

后来我找到了一个方法(说实在的很下流):
思路也是使用RegHotKey,可是他在构造函数中创建了一个自己的窗口句柄而不是使用父窗体的句柄.

不过还是谢谢你,分数奉上
black_fox 2002-05-20
  • 打赏
  • 举报
回复
如果你是要对控件操作。思路基本上差不多。但是你要接管其Parent的消息泵。来响应WM_HOTKEY消息,
另:RegisterHotKey和UNRegisterHotKey的句柄也应该是其Parent的。

应该还有其它的一些办法。但我一时想不出。。呵呵
black_fox 2002-05-20
  • 打赏
  • 举报
回复
Private
PROCEDURE Hotshortcut(VAR message: TMessage); message WM_HOTKEY;

VAR
FrmMain : TFrmMain;
Showkey : tshortcut;
ShowKeyID: integer;

PROCEDURE TFrmMain.FormCreate(Sender: TObject);
BEGIN
ShowKey:=16472;//此处为F12的值
ShowKeyID:= RegisterKey(Showkey);
END;


PROCEDURE TFrmMain.FormDestroy(Sender: TObject);
BEGIN
UnRegisterKey(ShowKeyID);
END;

PROCEDURE TFrmMain.Hotshortcut(VAR message: TMessage);
BEGIN
IF Self.visable then
hide
else
show;
END;



{************************************************
函数:UnRegisterKey
功能:反注册全局热键
输入:Atom数据
输出:成功为TRUE,失败返回False
作者:BlackFox
日期:2002/5/10
************************************************}
FUNCTION UnRegisterKey(VAR id: integer): boolean;
BEGIN
result := UnRegisterHotKey(handle, id);
DeleteAtom(id);
id := 0;

END;

{************************************************
函数:RegisterKey
功能:注册全局热键
输入:Key:要注册的热键
输出:返回一个Atom数据,失败返回0
作者:BlackFox
日期:2002/5/10
************************************************}

FUNCTION RegisterKey(key: Tshortcut): integer;
VAR
TheKey : Word;
TheShiftState : TShiftState;
state : uint;
BEGIN
Result := GlobalAddAtom(pchar(Format('Fox%d', [key])));
IF result = 0 THEN
exit;
state := 0;
ShortCutToKey(key, TheKey, TheShiftState);
IF ssShift IN TheShiftState THEN
state := state OR mod_shift;
IF ssalt IN theshiftstate THEN
state := state OR mod_alt;
IF ssctrl IN theshiftstate THEN
state := state OR MOD_CONTROL;
RegisterHotKey(handle, Result, state, thekey);

END;
wzrlover 2002-05-20
  • 打赏
  • 举报
回复
RegisterHotKey(不知道有没有写错)注册一个热键 试试
数字蛋糕 2002-05-20
  • 打赏
  • 举报
回复
为什么我最近提出的许多问题都没有人回答?
不会真的这么难吧.

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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