我这里有一个奇怪的问题。我为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()和10ms延迟,这是有效的罚款。)
小图片展示它的样子:
一切都很棒,但如果我最大化窗口,按钮就会消失。当我最小化和最大化窗口几次时,可以再次看到按钮,但是有非常奇怪的坐标(不是原来的0,0我给了他)。
那我的问题是什么?为什么坐标会偏移?
感谢您阅读我的长篇文章:)