SetWindowLongPtr не похоже на работу
Я попытался создать подкласс другого окна (в другом процессе), поэтому я ввел dll, который вызывает SetWindowLongPtr, но это не удается, и GetLastError возвращает 5.
BOOL APIENTRY DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
HWND hwnd = GetHwndProc();
if (!(orgWndProc = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)SubclassProc)))
{
char buf[40];
sprintf(buf, "Error code: %d", GetLastError());
MessageBox(hwnd, buf, "Error", MB_OK);
}
break;
}
}
return TRUE;
}
РЕДАКТИРОВАТЬ: это вызывающе правильный PID.
РЕДАКТИРОВАТЬ 2: я получил неправильный HWND, но это сейчас исправлено (также отредактировал код) я больше не получаю ошибку 5 (из GetLastError)
HWND GetHwndProc()
{
HWND hwnd = GetTopWindow(NULL);
DWORD currentPID = GetCurrentProcessId();
do
{
char title[256];
if ((GetWindowText(hwnd, title, 256) > 0) && (IsWindowVisible(hwnd)))
{
DWORD procId;
GetWindowThreadProcessId(hwnd, &procId);
if (procId == currentPID)
{
MessageBox(hwnd, title, "", MB_OK);
return hwnd;
}
}
hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
} while (hwnd);
}
WNDPROC orgWndProc;
LRESULT APIENTRY SubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_LBUTTONDOWN:
MessageBox(0, "Subclass", "", 0);
return TRUE;
default:
return CallWindowProc(orgWndProc, hwnd, msg, wParam, lParam);
}
}
Спасибо за чтение!
1 ответ
Вам нужно позвонить SetWindowSubclass
из потока, в котором было создано окно, в котором запускается связанная с ним очередь сообщений. От SetWindowSubclass
ссылка:
Предупреждение. Вы не можете использовать вспомогательные функции для создания подклассов в окнах потоков.
В очереди SetWindowLongPtr
должен вызываться из процесса, в котором было создано окно. От SetWindowLongPtr
ссылка:
Windows XP / 2000:
SetWindowLongPtr
Функция завершается ошибкой, если окно, указанное параметром hWnd, не принадлежит тому же процессу, что и вызывающий поток.
Существует также Изоляция привилегий пользовательского интерфейса, которая еще больше ограничивает доступ.