没有挑战性的问题我不会问:如何不使用DLL(hook)而实现系统级的键盘捕获?

zhangzhonghua 2000-09-01 03:08:00
是不是曲高和寡,再问一次。

我想让我的程序运行后,能截获F1, F2, F3等键盘输入
(以实现快捷键),不管我的程序是否是当前活动窗口,
该如何做?

我知道的是,用LoadAccelerators,
TranslateAccelerator这种方法,只能是线程级的,程序
是当前活动窗口时才有效;用Keyboard Hook这种方法,
据SDK文档说明,要做到系统级,须使用DLL。但是,我看
到有些软件如EyeDropper,只是一个exe文件就做到了系
统级截获,我不得其门而入。

EyeDropper位于http://eyedropper.inetia.com/

该程序只有一个36k大小的exe文件,直接运行。
可通过Properties->Miscellaneous设置快捷键。

我用VC自带的depends观察它调用了哪些DLL, API,所得信息非常
少;用spy++观察它的消息通信,只看到有WM_WINDOWPOSCHANGING。
这就让我感到很奇怪了,它怎么做的?

望高手指点一二,让我茅塞顿开,谢谢。
...全文
232 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxglcy 2000-12-14
  • 打赏
  • 举报
回复
用两句汇编只接监控键盘口:
mov al, 60h
mov b, al
b中为按下的键的代码,不过不是ASCII,你可以自己看看规律。
Holly 2000-09-02
  • 打赏
  • 举报
回复
Sorry! Paste Error!
提供完整的做法!
以CMainFrame为例:
声明成员变量:
int m_nHotKey;
在CMainFrame::OnCreate中:
m_nHotKey = GlobalAddAtom("Hotkey for MyApp!"); //取得唯一的注册键ID;
// 以左边的WINDOWS键为例!
if (!RegisterHotKey(GetSafeHwnd(), m_nHotKey, MOD_WIN, VK_LWIN))
{
DWORD dwError = GetLastError();
//处理失败!
...;
}
在CMainFrame::OnClose中:
UnregisterHotKey(GetSafeHwnd(), m_nHotLWin);

在消息映射表中增加:
ON_MESSAGE(WM_HOTKEY, OnMyHotKey)

添加成员函数:
afx_msg void OnMyHotKey(WPARAM wParam, LPARAM lParam);

void CMainFrame::OnMyHotKey(WPARAM wParam, LPARAM lParam)
{
if(wParam == m_nHotLWin)
AfxMessageBox("You have catch left win key successfully!");
}
JGTM2000 2000-09-02
  • 打赏
  • 举报
回复
Holly is almost right, but what you should intercept is WM_HOTKEY. I think it's just a typing mistake here.
nitrogen 2000-09-01
  • 打赏
  • 举报
回复
关注
axi 2000-09-01
  • 打赏
  • 举报
回复
You can use a dll file to hook the keyboard operation, Use SetWindowHookEx() to hot the keyboard operation(KEYBOARD_II), If pressed key is F1,F2,F3, You can posemessage(the message you can define by youself) to you Application, Then you can do everything on you aplicaiont.
Holly 2000-09-01
  • 打赏
  • 举报
回复
用RegisterHotKey注册你想截获的键盘输入,相应WM_SYSCOMMAND即可!

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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