Если у меня есть консольное приложение с ручкой, настроенной так;
HWND hWnd = GetConsoleWindow();
Тогда как мне установить новый wndProc для окна?
Я пытался с помощью
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc);
При этом conProc определяется как
LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_NCHITTEST:
return HTCAPTION;
}
return DefWindowProc(hWnd, msg, wParam, lParam );
}
Но это не работает и говорит: «Код ошибки: 5 — доступ запрещен» в GetLastError()
Я понимаю, что довольно сложно изменить консольное приложение, так как это приложение csrss.exe и все такое, но я все еще хотел бы попробовать ..
Благодарю.
Хотя создается впечатление, что консольное окно принадлежит вашему процессу (как и другое окно), на самом деле оно размещается CSRSS
системный процесс и его WndProc есть. Это лишает вас возможности создавать подклассы окна и предоставлять свой собственный WndProc, живущий в вашем процессе.
Некоторые связанные чтения:
Прежде всего SetWindowLong заменяется SetWindowLongPtr, вы должны использовать эту функцию.
Вы пытаетесь изменить WNDPROC своего собственного окна консоли или другого процесса?
Из документов MSDN:
GWL_WNDPROC
-4
Sets a new address for the window procedure.
You cannot change this attribute if the window does not belong to the same process as the calling thread.