无法在Borland C ++ Builder中将SetWindowsHookEx与LowLevelKeyboardProc一起使用

时间:2012-08-17 13:55:52

标签: c++builder setwindowshookex

我正在开发一种软​​件,它必须在运行时阻止某些键盘输入。既然我已经谈到了这个愿望的一些问题,我不会在这里重复细节(为了更好地理解这些情况,请阅读:How can I disable specific Windows hotkeys from inside a software using C++?

我现在的问题是我能够用Qt做我想要的,现在我必须将它传递给Borland C ++ Builder 6,但是Builder的编译器拒绝代码:

SWH_return = SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0);

指出

  

[C ++错误] FrmMain.cpp(155):E2034无法将'long(__ stdcall *)(int,unsigned int,long)'转换为'int(__stdcall *)()'

这很奇怪,一旦Qt发现这行代码没有任何问题,一切运行正常。问题是在“SetWindowsHookEx”中包含“LowLevelKeyboardProc”。我在代码中尝试了一些更改,但没有成功。

有人可以帮我解决这个问题吗?

谢谢,

Momergil

注意:有关代码的更多详细信息,请访问我发布的链接。

2 个答案:

答案 0 :(得分:1)

我认为这与没有定义预处理器宏STRICT有关。

但是,简单的解决方法是将函数指针强制转换为HOOKPROC

SWH_return = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, GetModuleHandle(NULL), 0);

答案 1 :(得分:1)

问题解决了 - 尽管可能没有像人们期望的那样......

Borland Builder c ++ 6来自2002年,并且比较了Builder的编译器版本的winuser.h文件(其中定义了HOOKPROC)和Qt的winuser.h。我注意到它们彼此完全不同,正如人们所期望的那样自从微软发布Builder版本的文件已有10年了。

所以我要做的就是评论Builder的winuser.h行,其中声明了HOOKPROC,ctrl + c / ctrl + v Qt的winuser.h版本的HOOKPROC定义,它运行良好。

但是,我不认为这将是解决这个问题的最“政治上正确”的方式,但无论如何它都有效。

谢谢,

Momergil