0

ここで奇妙な問題があります。ボタンを「オーバーレイ」できるように、Spotify 用の DLL プロキシを作成しました。基本的に、それがどのように機能するかです:

DllMain
  -> Creates CMain class
    -> Creates CToggleButton class
      -> Hooks the button onto the Spotify window

スレッドはメンバー関数を呼び出すことができないため、スレッドに使用する静的メソッドと、メンバー関数によって呼び出される非静的関数の 2 つのメソッドがあります。
これで、スレッドを作成し、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