求救:组合快捷键问题!

zfmich 2000-06-02 01:52:00
各位大侠:
你们好!
我想通过在键盘钩子中设置快捷键,如果是组合键不知要如何实现,还望赐教,谢谢!
zfmich
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhzh426 2000-07-14
  • 打赏
  • 举报
回复
关注!
zfmich 2000-06-13
  • 打赏
  • 举报
回复
谢谢各位!
Lin 2000-06-05
  • 打赏
  • 举报
回复
zfmich:
  由于你的Mail Address不可用(好象Sina拒绝处理21CN的信件?),所以在此回复。
  我个人的愚见,使用键盘钩子不太划算,一般来说,在系统注册一个HotKey就足够了,具体方法如下:
1、在Form的OnCreate事件中用API注册一个HotKey, RegisterHotKey声明如下:
BOOL RegisterHotKey(
HWND hWnd, // 窗口句柄
int id, // identifier of hot key
UINT fsModifiers, //Ctrl、Alt、Shift的组合
UINT vk // 虚键码
);
其中第二个参数可以用RegisterWindowMessage向系统注册一个独一无二的ID;
2、在Protected段声明一个消息处理过程:
protected
...
 procedure WMHotKey(var AMsg: TMessage); message WM_HOTKEY;
...
实现如下:
...
procedure TfrmMain.WMHotKey(var AMsg: TMessage);
var wnd: HWND;
Msg: UINT;
begin
inherited;
if (LOWORD(AMsg.lParam) = ShiftKey) and //ShiftKey可以为Ctrl、Alt、Shift的组合
(HIWORD(AMsg.lParam) = HotKey) then //HotKey 为虚键码
begin
//在这里做你要做的事
end;
...
3、在Form的OnClose或者OnDestroy事件中注销Hotkey:
procedure TfrmMain.FormClose(Sender: TObject)
begin
..
UnregisterHotKey(Handle, uMsg); //此处的uMsg为注册HotKey时使用的id。
...
end;
4、祝你成功。欢迎来信探讨。

  仁者见仁,智者见智,以上意见,只供参考。
zfmich 2000-06-05
  • 打赏
  • 举报
回复
没用过,能详细说一说吗?谢谢!
Lin 2000-06-04
  • 打赏
  • 举报
回复
我个人愚见,用键盘Hook不是一个明智的做法,应该注册一个HotKey,然后处理WM_HOTKEY消息即可。
zfmich 2000-06-02
  • 打赏
  • 举报
回复
谢谢!万分感谢!我去试试。:)
halfdream 2000-06-02
  • 打赏
  • 举报
回复
这是一个CTRL—D 的例子。本是DELPHI下的,我改了一下。

LRESULT _export _stdcall KeyboardHookHandler(int iCode, WPARAM wParam,
LPARAM lParam )
{
const _KeyPressMask = 0x80000000;
if(iCode < 0)return CallNextHookEx(hNextHookProc, iCode, wParam, lParam);

if (((lParam & _KeyPressMask) == 0)&&
(GetKeyState(VK_CONTROL) < 0)&&(wParam =='D'))
//GetKeyState为负表示按下。
{
WinExec("Notepad.exe", SW_NORMAL); //
return 1;
}
return 0;
}

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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