2012-11-14 17 views
7

Jeśli mam aplikację konsolową z uchwytem, ​​ustaw ją tak;C++: Jak ustawić nowy wndProc dla aplikacji konsolowej?

HWND hWnd = GetConsoleWindow(); 

Następnie, jak skonfigurować nowy wndProc dla okna?
Próbowałem za pomocą

SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc); 

Z conProc zdefiniowany jako

LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_NCHITTEST: 
      return HTCAPTION; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

Ale to nie działa i mówi: "Error code: 5 - Odmowa dostępu" na GetLastError()

rozumiem że jest to dość trudne do zmodyfikowania aplikacji konsolowej w ten sposób, ponieważ jest to aplikacja csrss.exe i wszystkie, ale nadal chciałbym spróbować .. Dzięki.

+0

W zależności od tego, co to jest * do *, można znaleźć [projekt Console] (http: // SourceForge .net/projects/console /) użyteczne. –

+2

To ciekawe, ponieważ chciałem powiedzieć, że możesz pobrać "WNDCLASSEX" z nim związany i stworzyć własne okno oparte na tym, ale okazuje się, że chwytanie 'WNDCLASSEX' jest trochę trudne. 'GetClassInfoEx' wymaga uchwytu modułu, a uzyskanie tego uchwytu jest denerwujące. Nawet 'CreateToolhelp32Snapshot' wyraźnie stwierdza, że ​​nie można go używać z csrss.exe. – chris

Odpowiedz

10

Choć wrażenie, że okno konsoli należy do procesu (jak inne okna), w rzeczywistości jest gospodarzem CSRSS procesu systemowego i jego WndProc ma. To sprawia, że ​​nie możesz podklasować okna i zapewnić własne WndProc żyjące w twoim procesie.

Niektóre pokrewne czytanie:

+0

Naprawdę nie szukam odpowiedzi "nie da się", ale dałeś mi kilka interesujących linków, więc awansowałem. Słyszałem, że ludzie są w stanie robić tego rodzaju rzeczy i interesuje mnie, jak to zrobili. Zrobiłem szybkie wyszukiwanie w Google i znalazłem to: http://www.codeforge.com/read/115608/CsrssHook.c__html - Wydaje się, że jest to przykładowy kod służący do przechwytywania w CSRSS. Sądzę, że byłby to dowód na to, że można to zrobić ...? –

+0

Próbka, do której się odwołujesz, implementuje wstrzyknięcie kodu do procesu docelowego, abyś mógł wprowadzić swój własny "WndProc" w tym procesie ... Może się to jednak udać, jeśli masz wystarczające uprawnienia do przechwycenia procesu systemowego. Nie zdziw się otrzymaniem 'ERROR_ACCESS_DENIED' dla' OpenProcess (PROCESS_ALL_ACCESS, ... '. –

+1

W Windows 7+ okno konsoli jest hostowane przez conhost.exe, który działa w kontekście bezpieczeństwa klienta, czyli w tym przypadku mieć "PROCESS_ALL_ACCESS". – eryksun

0

Przede wszystkim SetWindowLong został zastąpiony przez SetWindowLongPtr, powinieneś użyć tej funkcji.

Czy próbujesz zmienić WNDPROC własnego okna konsoli lub innego procesu?

Od docs 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.

+4

Jego własne okno konsoli należy do innego procesu, –

+0

Co Hans Passant powiedział. –

Powiązane problemy