导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

WH_KEYBOARD_LL的hook问题,求高手指点,:)

altaxa 2002-07-31 09:56:43
我定义的全局钩子,安装函数如下:
DllExport void WINAPI InstallLaunchEv()
{
Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LauncherHook, theApp.m_hInstance,0);
}
钩子函数如下:
LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
// By returning a non-zero value from the hook procedure, the
// message does not get passed to the target window
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
BOOL bControlKeyDown = 0;

switch (nCode)
{
case HC_ACTION:
{
// Check to see if the CTRL key is pressed
bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);

// Disable CTRL+ESC
if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
return 1;

// Disable ALT+TAB
if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
return 1;

// Disable ALT+ESC
if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN)
return 1;

break;
}

default:
break;
}
return CallNextHookEx (Hook, nCode, wParam, lParam);
}
编译出现一下问题:
error C2065: 'WH_KEYBOARD_LL' : undeclared identifier
error C2065: 'KBDLLHOOKSTRUCT' : undeclared identifier
error C2065: 'pkbhs' : undeclared identifier
error C2059: syntax error : ')'
error C2227: left of '->vkCode' must point to class/struct/union
error C2227: left of '->vkCode' must point to class/struct/union
error C2227: left of '->flags' must point to class/struct/union
error C2065: 'LLKHF_ALTDOWN' : undeclared identifier
error C2227: left of '->vkCode' must point to class/struct/union
error C2227: left of '->flags' must point to class/struct/union
Error executing cl.exe.

LaunchDLL.dll - 10 error(s), 0 warning(s)

...全文
502 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bugyouth 2002-08-02
关注
回复
Celso 2002-08-02
#ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#endif WIN32_LEAN_AND_MEAN
回复
ThisTimeThree 2002-08-02
stdafx.h第一行还是afxstd.h第一行?记不得了
回复
ImDD 2002-08-01
可以在winuser.h中查找KBDLLHOOKSTRUCT,找到对应的结构后把前面的#if (_WIN32_WINNT >= 0x0400)挪后一点就行了,WH_KEYBOARD_LL和LLKHF_ALTDOWN可以用同样的方法,但改动它我不清楚会不会出问题,望考虑好了再这样用。
回复
altaxa 2002-07-31
加在 *.CPP的第一行
还是原来的错误
回复
zhuwenzheng 2002-07-31
加在你的 *.CPP的第一行
回复
altaxa 2002-07-31
加在winuser.h的第一行。
出现了连接错误:
rror LNK2001: unresolved external symbol "long __stdcall LauncherHook(int,unsigned int,long)" (?LauncherHook@@YGJHIJ@Z)
Debug/LaunchDLL.dll : fatal error LNK1120: 1 unresolved externals
加在dll的头文件的第一行,则出现与原来一样的问题。sign~~`
好磨人啊!
回复
zhuwenzheng 2002-07-31
要加在程序的第一行
回复
altaxa 2002-07-31
我是想屏蔽掉系统键。所以没有采用KEYBOARD_HOOK.
楼上的zhuwenzheng gg的方法,我用了,还是原来一样的错误。
回复
zhuwenzheng 2002-07-31
ADD THIS
#define _WIN32_WINNT 0x0500
回复
duqiang2050 2002-07-31
用WH_KEYBOARD不就行么?
看看我的代码,是截获1、2、3健的
CHookApp theApp;
BOOL installhook()
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,theApp.m_hInstance,0);
return TRUE;
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam) //键盘按键标识
{
case '1':sndPlaySound("D:\\WINDOWS\\Application Data\\Microsoft\\WELCOME\\WELCOM98.WAV",SND_ASYNC);break; //当数字键1被按下
case '2':AfxMessageBox("2.wav");break;
case '3':AfxMessageBox("3.wav");break;
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
回复
altaxa 2002-07-31
哦,怎样改动winuser.h呢?
回复
zhanghc 2002-07-31
我也碰到过同样的问题,KBDLLHOOKSTRUCT和WH_KEYBOARD_LL是在winuser.h中定义的,它会检查当前windows版本号,只有在2000和某些NT4版本下才能有效,但我在2000下也碰到了同样问题,我通过改动winuser.h编译通过,不过不清楚这样会有什么害处
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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