ここで奇妙な問題があります。ボタンを「オーバーレイ」できるように、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 ではありません)。
ここで私の問題は何ですか?座標がオフセットされるのはなぜですか? 私の長い投稿を読んでくれてありがとう:)