我有一个低级鼠标钩子,我试图用它来处理全局左键单击事件。我在一个基本的主窗体类中定义了钩子,如下所示:
class TMainForm : public TForm
{
private:
HHOOK hMouseHook;
static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
void __fastcall MouseHook(int nCode, WPARAM wParam, LPARAM lParam);
};
extern PACKAGE TMainForm *MainForm;
LRESULT CALLBACK TMainForm::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MainForm->MouseHook(nCode, wParam, lParam);
return CallNextHookEx(0, nCode, wParam, lParam);
}
void TMainForm::MouseHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0 && wParam == WM_LBUTTONDOWN)
{
HWND__ * handle = Platform::Win::WindowHandleToPlatform(this->Handle)->Wnd;
RECT Rect;
GetWindowRect(handle, &Rect);
}
}
我的鼠标钩子可以很好地检测到左键单击,但是当我尝试获取我的句柄时,我MainForm
遇到了访问冲突。
我最初认为这可能是因为我试图在TMainForm
类中检索句柄,而实际上在运行时,继承自的表单TMainForm
将处于活动状态。为此,我编写了一个名为GetHandle()
.
这个函数在TMainForm
头文件中定义如下:
virtual HWND__ * __fastcall GetHandle();
在继承类中是这样的:
HWND__ * __fastcall TMainFormPass::GetHandle()
{
return Platform::Win::WindowHandleToPlatform(this->Handle)->Wnd;
}
但是,当我打电话时GetHandle()
,TMainForm
我仍然会遇到访问冲突。此外,在尝试了更多的事情之后,我意识到从内部调用任何虚函数都会MouseHook
导致访问冲突。
为什么我无法使用 Platform::Win::WindowHandleToPlatform(this->Handle)->Wnd;
inside of检索我的表单句柄MouseHook
?为什么在内部调用虚函数MouseHook
会导致访问冲突?
编辑:
为了测试 Remy 提出的 MainForm 指针无效的答案,我在TMainForm
构造函数中添加了一段代码来测试指针是否有效。TMainForm
此外,我向继承自并在启动我的应用程序时加载的类的构造函数添加了一段代码,以测试其全局指针。我班级中的全局MainForm
指针TMainForm
实际上是无效的。但是,继承类的全局指针是有效的,因为它是实际被实例化的类。