2012-08-17 100 views
2

我正在开发一个软件,它在运行时必须阻止某些键盘输入。由于我谈到了一些满足这个愿望的问题,因此我不会在此重复细节(为了更好地理解这些情况,请阅读:How can I disable specific Windows hotkeys from inside a software using C++?在Borland C++ Builder中不能使用SetWindowsHookEx和LowLevelKeyboardProc

我现在的问题是我能够做什么我想要使​​用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

注:有关代码的详细信息,只需访问我发布的链接。

回答

1

我认为这涉及到没有预定义宏STRICT定义。

但是,简单的解决方法是将函数指针投射到HOOKPROC

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

嗯,我想我尝试这样做,它不会工作:T – Momergil 2012-08-17 20:08:22

1

问题解决了 - 尽管也许并不像人们所期望的......

Borland的生成C++ 6是自2002年以来,和比较Builder的编译器的版本WINUSER.H文件(其中HOOKPROC定义)和Qt的winuser.h,我注意到它们与另一个完全不同,正如人们期望的那样,因为微软发布Builder的文件版本已经过去了10年。

因此,我不得不做的只是评论HOOKPROC被声明的Builder的winuser.h行和ctrl + c/ctrl + v Qt的winuser.h版本的HOOKPROC定义,并且它工作正常。

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

感谢,

Momergil

相关问题