我这里有个奇怪的问题。我为 Spotify 创建了一个 DLL 代理,因此我可以在其上“叠加”一个按钮。基本上,这就是它的工作原理:
DllMain
-> Creates CMain class
-> Creates CToggleButton class
-> Hooks the button onto the Spotify window
它有两种方法,一种是我用于线程的静态方法,因为线程不能调用成员函数,另一种是由成员函数调用的非静态函数。
有了这个,我创建线程并通过 lpParam 传递 CToggleButton 类的实例:
CreateThread(0, NULL, WindowThreadStatic, (void*)this, NULL, NULL);
然后,WindowThreadStatic 函数:
DWORD WINAPI CToggleButton::WindowThreadStatic(void* lpParam)
{
return ((CToggleButton*)lpParam)->WindowThread();
}
以及类里面的主窗口线程函数:
DWORD CToggleButton::WindowThread()
{
MSG msg;
hButton = CreateWindowA("BUTTON", "Test", (WS_VISIBLE | WS_CHILD), 0, 0, 100, 20, parenthWnd, NULL, hInst, NULL);
bool bQueueRunning = true;
while (bQueueRunning)
{
if (PeekMessage(&msg, parenthWnd, 0, 0, PM_REMOVE))
{
switch (msg.message)
{
case WM_QUIT:
bQueueRunning = false;
break;
case WM_LBUTTONDOWN:
if (msg.hwnd == hButton)
{
MessageBoxA(parenthWnd, "Button!", "Button", MB_OK);
continue;
}
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(10);
}
return 0;
}
如您所见,这还包含按钮的消息循环(我没有在这里使用 GetMessage(),因为它非常无响应,所以我决定使用 PeekMessage() 和 10 毫秒的延迟,效果很好。)
小图片显示它的样子:
一切都很好,但如果我最大化窗口,按钮就会消失。当我多次最小化和最大化窗口时,可以再次看到按钮,但坐标非常奇怪(不是我给他的原始 0,0)。
那么我的问题是什么?为什么坐标会偏移?感谢您阅读我的长篇文章 :)