2012-11-14 10 views
7

Se si dispone di un'applicazione di console con un handle configurato in questo modo;C++: come impostare un nuovo wndProc per un'applicazione console?

HWND hWnd = GetConsoleWindow(); 

Quindi come impostare un nuovo wndProc per la finestra?
Ho provato ad utilizzare

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

Con conProc essere definita come

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

Ma non funziona e dice: "Codice di errore: 5 - Accesso negato" sul GetLastError()

ho capito che è piuttosto difficile modificare l'applicazione della console in questo modo, poiché è un'applicazione csrss.exe e tutto, ma mi piacerebbe ancora provare .. Grazie.

+0

A seconda di ciò che è * per *, è possibile trovare il [progetto Console] (http: // sourceforge .net/projects/console /) utili. –

+2

È interessante perché stavo per dire che potresti prendere il 'WNDCLASSEX' associato ad esso e creare la tua finestra basata su quella, ma si scopre che afferrare' WNDCLASSEX' è un po 'difficile. 'GetClassInfoEx' ha bisogno di un handle di modulo e ottenere quell'handle è fastidioso. Anche 'CreateToolhelp32Snapshot' afferma chiaramente che non è possibile usarlo con csrss.exe. – chris

risposta

10

Mentre l'impressione è che la finestra della console appartiene al vostro processo (come altra finestra), è infatti ospitato da CSRSS processo di sistema e la sua WndProc c'è. Ciò ti rende impossibile creare una sottoclasse della finestra e fornire il tuo WndProc che vive nel tuo processo.

qualche lettura correlato:

+0

Non sto davvero cercando una risposta "non può essere fatta", ma mi hai dato dei link interessanti, quindi ti ho revocato. Ho sentito di persone che sono in grado di fare questo genere di cose e sono interessato a come l'hanno fatto. Ho fatto una rapida ricerca su Google e ho trovato questo: http://www.codeforge.com/read/115608/CsrssHook.c__html - Sembra che questo sia un codice di esempio utilizzato per collegarsi a CSRSS. Immagino che sarebbe una sorta di prova che si può fare ..? –

+0

L'esempio a cui si fa riferimento all'introduzione del codice implementa nel processo di destinazione, in modo da poter fornire il proprio 'WndProc' all'interno di quel processo ... Ciò potrebbe funzionare se si dispone di autorizzazioni sufficienti per collegare il processo di sistema, comunque. Non essere sorpreso di ottenere 'ERROR_ACCESS_DENIED' per' OpenProcess (PROCESS_ALL_ACCESS, ... '. –

+1

In Windows 7+ la finestra della console è ospitata da conhost.exe, che viene eseguito nel contesto di sicurezza del client, cioè in questo caso tu avere 'PROCESS_ALL_ACCESS'. – eryksun

0

Prima di tutto SetWindowLong è stato sostituito da SetWindowLongPtr, è necessario utilizzare tale funzione.

Si sta tentando di modificare il WNDPROC della propria finestra della console o un altro processo?

Dalla documentazione 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

La sua finestra della console appartiene a un altro processo, –

+0

, che cosa ha detto Hans Passant. –