У меня здесь странная проблема. Я создал прокси DLL для Spotify, чтобы я мог «наложить» на него кнопку. По сути, вот как это работает:
DllMain
-> Creates CMain class
-> Creates CToggleButton class
-> Hooks the button onto the Spotify window
У него есть два метода, один статический, который я использую для потока, поскольку потоки не могут вызывать функции-члены, и один нестатический, который вызывается функцией-членом.
После этого я создаю поток и передаю экземпляр класса CToggleButton через lpParam:
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, которые я ему дал).
Так в чем моя проблема здесь? Почему координаты смещены?
Спасибо за чтение моего длинного поста 🙂
Задача ещё не решена.
Других решений пока нет …