风之谷
点亮心灵,基础补习中...

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

统计
  • 随笔 - 15
  • 文章 - 1
  • 评论 - 35
  • 跟踪 - 0

公告
  • 有事点这里

文章分类

档案

随笔分类

相册

好友博客

技术站点

登录
    帐号
    密码
    记住我:
     
 

全局热键:
Id := GlobalAddAtom('MyHotKey') - $C000;
注:Id的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值在0xC000到

0xFFFF之间,所以减掉0xC000来满足调用要求。

原理:
  一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你

的应用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY

消息的格式为: 
idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键
uVirtKey = (UINT) HIWORD(lParam); //热键的键值

与THotKey控件的结合使用:

type
  TForm1 = class(TForm)
    HotKey1: THotKey;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    procedure WMHotKey(var Msg:TMessage);message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  Key, Shift: Word;
  Id: Integer;

procedure ShortCutToKey(ShortCut: TShortCut; var Key: Word; var Shift: TShiftState);
begin
  Key := ShortCut and not (scShift + scCtrl + scAlt);
  Shift := [];
  if ShortCut and scShift <> 0 then Include(Shift, ssShift);
  if ShortCut and scCtrl <> 0 then Include(Shift, ssCtrl);
  if ShortCut and scAlt <> 0 then Include(Shift, ssAlt);
end;

function ShiftStateToWord(TShift: TShiftState): Word;
begin
  Result := 0;
  if ssShift in TShift then Result := MOD_SHIFT;
  if ssCtrl in TShift then Result := Result or MOD_CONTROL;
  if ssAlt in TShift then Result:= Result or MOD_ALT;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  T: TShiftState;
begin
  Id := GlobalAddAtom('MyHotKey') - $C000;
  ShortCutToKey(HotKey1.HotKey, Key, T);
  Shift := ShiftStateToWord(T);
  RegisterHotKey(Handle, Id, Shift, Key);
end;

procedure TForm1.WMHotKey(var Msg: TMessage);
begin
  if (Msg.LparamLo = Shift) AND (Msg.LParamHi = Key) then
    ShowMessage('This is HotKey');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, Id);
  GlobalDeleteAtom(Id);
end;

end.

感觉THotKey控件还是很好用的嘛.

2004年11月18日 20:04
评论
  • # 回复: 全局热键和THotKey控件的使用
    李马
    2004-11-18 23:18
    感觉THotKey控件还是很好用的嘛.
    ===============================
    你昨天好像不是这么说的
  • # 回复: THotKey控件的使用-全局热键
    xkdcc
    2005-5-25 3:08
    你好,我想学这个控件,但是不知在哪下载,能告诉我吗?
    QQ34692088
    谢谢!
主题  
姓名  
主页
验证码  
内容   
 

请不要发表可能给我们带来伤害的政治言论,谢谢配合