0

我这里有个奇怪的问题。我为 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)。
在此处输入图像描述 那么我的问题是什么?为什么坐标会偏移?感谢您阅读我的长篇文章 :)

4

0 回答 0