唉。。搞不懂钩子。麻烦告诉我错在那里-_-

lunar3 2002-03-13 12:30:10
我这样写
__declspec(dllexport) BOOL Zdll_InstallMyzdll_hook( HWND hWnd )
{
if(zdll_hWndServer != NULL)
return FALSE; // already zdll_hooked!
zdll_hook = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)Zdll_hookproc, zdll_hInst, 0 );
if(zdll_hook != NULL)
{ /* success */
zdll_hWndServer = hWnd;
return TRUE;
} /* success */

return FALSE; // failed to set zdll_hook
} // setMyzdll_hook


static LRESULT CALLBACK Zdll_hookproc( UINT nCode, WPARAM wParam, LPARAM lParam )
{
if(nCode < 0)
{ /* pass it on */
CallNextHookEx(zdll_hook, nCode, wParam, lParam);
return 0;
} /* pass it on */

if( (lParam & 0x01FF0000) == zdll_lparamHotKeyOffAuto )
PostMessage(zdll_hWndServer, WM_USER_ON_AUTO, 0, lParam );
else if( (lParam & 0x01FF0000) == zdll_lparamHotKeyOffAuto )
PostMessage(zdll_hWndServer, WM_USER_OFF_AUTO, 0, lParam );

本来呢,我用WH_KEYBOARD这个Flag可以达到我的要求,可是如此一来当程序是背景时就无效了,就是不肯来hookproc。

后来呢,我用WH_GETMESSAGE,这样子虽然程序在背景时也有响应,但是到hookproc时的lParam却不对了-_-.

然后呢,我就改成在hookproc时用GetKeyState(VK_F2)判断後发送消息,结果是近乎死机,就好像是有处理不完的消息一样。。=_=

我又试了几个flag(WH_FOREGROUNDIDLE,WH_CALLWNDPROC..)就是不行。我只是想在背景时也能启动我的热键啊。(因为是给人选键的,所以用钩子比用HotKey好吧。)

大侠啊,我那里错了啊>_<
...全文
81 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lunar3 2002-03-13
  • 打赏
  • 举报
回复
唉。。弄了半天弄错地方了。其实都有来
static LRESULT CALLBACK Zdll_hookproc( UINT nCode, WPARAM wParam, LPARAM lParam );
只不过在背景时来的值就是不对
比如用下面的判断。这个zdll_lparamHotKeyOffAuto的值就是F9的Keybd的值
if( (lParam & 0x01FF0000) == zdll_lparamHotKeyOffAuto )
PostMessage(zdll_hWndServer, WM_USER_ON_AUTO, 0, lParam );
不是背景时就会PostMessage,可是呢在背景时就不会,
用GetKeyState(VK_F9)<0来判断也是一样,在背景就不对
为什么啊。。。有什么方法吗??
tleon 2002-03-13
  • 打赏
  • 举报
回复
.def可以包含导出的函数

ZSHARE share read write
是设置全局数据区,功能和#pragma comment(linker, "/section:ZSHARE,rws") 一样

看了半天也没看懂你问题的意思,真是太深奥了
lunar3 2002-03-13
  • 打赏
  • 举报
回复
我又加上了以下。。。
#pragma data_seg("ZSHARE")
HWND zdll_hWndServer = NULL;
UINT zdll_nMsg = 0;
HHOOK zdll_hook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:ZSHARE,rws")
还是无法在背景时侦测,,
那个.def有啥用?看了老半天也看不懂(也找不到有.def档的例子。.)
wiler 2002-03-13
  • 打赏
  • 举报
回复
在.def文件中这样写:(具体在msdn里面有的)
zdll_hWndServer share read write
lunar3 2002-03-13
  • 打赏
  • 举报
回复
哦,对了,要是用RegisterHotKey( GetSafeHwnd(), 0x1111, 0, 65 );的话
系统一检测到这个热键就到我的程序,可是也就不会传消息给其他线程了,这样不行啊。。不好啊。。不对啊。。>_<
lunar3 2002-03-13
  • 打赏
  • 举报
回复
嗯。。哦。。这样啊。。
可是呢。用钩子做热键是“我毕生的志愿“
告诉我错在那里嘛。>o<
jishiping 2002-03-13
  • 打赏
  • 举报
回复
你可以用函数 RegisterHotKey() 和 UnregisterHotKey() 就可以
达到要求了(在背景时也能响应),哪里需要用什么钩子。
lunar3 2002-03-13
  • 打赏
  • 举报
回复
唉。。吃个饭就被淹没了....

16,551

社区成员

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

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

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