无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc

Posted

技术标签:

【中文标题】无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc【英文标题】:Not being able to use SetWindowsHookEx with LowLevelKeyboardProc in Borland C++ Builder 【发布时间】:2012-08-17 13:55:51 【问题描述】:

我正在开发一个在运行时必须阻止某些键盘输入的软件。由于我已经谈到了放弃这个愿望的一些问题,我不再在这里重复细节(为了更好地了解情况,请阅读: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”。我尝试了对代码进行一些更改,但没有成功。

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

谢谢,

莫默吉尔

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

问题已解决 - 尽管可能不像人们预期的那样......

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 的定义,它工作正常。

不过,我不认为这是解决这个问题的最“政治正确”的方式,但无论如何它确实奏效了。

谢谢,

莫默吉尔

【讨论】:

以上是关于无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc的主要内容,如果未能解决你的问题,请参考以下文章

Borland Builder C++ 6 中的 CoreAudio API

Borland C++ Builder 中的 Windows 子类化

添加了库; Borland C++ Builder 无故暂停

虚拟内存地址空间不足(Borland C++ Builder 6 程序)

Borland C++ Builder 6 上的奇怪链接器错误

C++有几种,是否有微软的,还有borland c++和c++ builder?还有没有别的,哪些是淘汰了的?