Domanda

Due domande.

1) ho capito che questo deve essere un risultato previsto, ma forse qualcuno può dirmi che cosa sto facendo male; Sto cercando di creare una sottoclasse tutte le classi di finestra in un hook globale e funziona solo che io non sono in grado di chiudere bottega come dovrei e quando il programma inizialmente registrare il gancio annulla la registrazione del gancio e uscite, applicazioni sottoclasse iniziano a schiantarsi.

Ecco come sto cercando di farlo ..

// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;

// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);

// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
   if (origWndProcs.find(hwnd) != origWndProcs.end()) {
      SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
   }
}

// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {

    BOOL unhooked = UnhookWindowsHookEx(hook) &&
       UnhookWindowsHookEx(kb_hook) &&
       UnhookWindowsHookEx(mouse_hook) && 
       UnhookWindowsHookEx(cbt_hook);

    if(unhooked)
       hWndServer = NULL;
    return unhooked;
}

In DllMain non faccio nulla sul DLL_PROCESS_DETACH. Invece, ClearHooks () viene richiamato dal programma inizialmente registrare i ganci e c'è solo dopo che il gancio ha inviato un messaggio di segnalazione che ha eseguito l'operazione EnumWindows (ripristini wndProcs originali, vedi sopra).

finestre I sottoclasse in un gancio WndProc; tutte le finestre visibili che ricevono un messaggio e la cui WndProc attuale non è quello nella DLL, sono sottoclassi.

In pratica tutti (per quanto posso dire) le applicazioni in crash in uscita, nonostante il fatto che le finestre sembrano ottenere il set di nuovo WndProc per quello che era quando è stato sostituito. Qualcuno ha idea di cosa potrei fare male?

2) Ho bisogno di questo per intercettare WM_MINMAXINFO e modificare la finestra maxsize ogni volta che viene massimizzata una finestra. Purtroppo non posso fare questo nel dll, ma devo parlare con un programma per avere le informazioni di formato. Allora, qual è il modo migliore per parlare con quella finestra; Ho bisogno di passare di nuovo un po 'di informazioni in modo da poter modificare la struttura che è venuto con il messaggio WM_MINMAXINFO originale. Sarà una struttura in WM_COPYDATA preservarla di dati fino a quando la chiamata a rendimenti SendMessageTimeout?

Grazie

È stato utile?

Soluzione

Ci sono un sacco di punti di dolore qui. L'utente si assume che nessun altro codice sottoclasse la finestra. E che tale codice non-sottoclasse nel giusto ordine. Non c'è un ordine giusto, il vostro aggancio è abbastanza asincrono dall'esecuzione del programma.

Ma, la soluzione è abbastanza semplice. Sei già agganciando con SetWindowsHookEx, potrebbe anche fare un altro. WH_CALLWNDPROC o WH_CALLWNDPROCRET, a seconda di cosa si vuole fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top