winapi — C ++: как установить новый wndProc для консольного приложения?

Если у меня есть консольное приложение с ручкой, настроенной так;

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 и все такое, но я все еще хотел бы попробовать ..
Благодарю.

8

Решение

Хотя создается впечатление, что консольное окно принадлежит вашему процессу (как и другое окно), на самом деле оно размещается CSRSS системный процесс и его WndProc есть. Это лишает вас возможности создавать подклассы окна и предоставлять свой собственный WndProc, живущий в вашем процессе.

Некоторые связанные чтения:

12

Другие решения

Прежде всего 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.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector