2012-01-06 7 views
6

Se una finestra, ad es. Firefox, cambia il suo titolo, da Firefox a Stack Overflow - Firefox quindi voglio che la mia app registri che Firefox ha cambiato il suo titolo.Evento modificato titolo finestra

È questo possibile senza l'uso di un gancio e anello (EnumWindows)? Se può essere fatto solo con un gancio, quale tipo di gancio?

+0

Stai parlando di un singolo browser e di reindirizzamenti ..? hai cercato su richiesta/risposta e accesso alle intestazioni ?? solo curioso di sapere se io sono sulla stessa pagina come sei .. – MethodMan

+1

Sì, gancio richiesto. Abbastanza sicuro di averti già parlato di WH_SHELL. –

+1

possibile duplicato di [Log tutte le finestre che si chiudono in Windows] (http://stackoverflow.com/questions/8648386/log-all-windows-that-are-closed-in-windows) –

risposta

9

WinEvents è il modo di andare qui. L'API di cui hai bisogno è SetWinEventHook() - se ti interessa una finestra specifica, usa GetWindowThreadProcessId() per ottenere il threadId dell'HWND e poi ascolta gli eventi solo da quel thread specifico. Per le modifiche al titolo della finestra, ti consigliamo l'evento EVENT_OBJECT_NAMECHANGE.

È possibile agganciare "nel contesto" o "fuori dal contesto" - il secondo è il più semplice, e significa che l'evento viene restituito al proprio processo, quindi non è necessaria una DLL separata - che lo rende possibile fare tutto in C#; ma il thread che chiama SetWinEventHook deve avere un ciclo di messaggi (GetMessage/TranslateMessage/DispatchMessage), poiché gli eventi vengono recapitati utilizzando una forma di messaggi dietro le quinte.

Nel callback di WinEvent, è necessario verificare che HWND sia quello a cui tieni, dal momento che otterrai modifiche al nome per qualsiasi UI su quel thread di destinazione, possibilmente includendo modifiche al nome della finestra figlio o altre cose non ti interessa.

-

Tra l'altro, è possibile controllare this answer per qualche campione codice C# che utilizza WinEvents; li sta usando per tenere traccia delle modifiche della finestra in primo piano su tutte le finestre del desktop; ma dovresti solo fare alcune semplici modifiche sopra descritte per tenere traccia delle modifiche al nome su una finestra specifica.

+1

EVENT_OBJECT_NAMECHANGE si verificano molto, viene attivato anche quando si sposta il mouse sulla stessa scheda della stessa finestra! è correlato a ciò che hai detto "eventualmente includendo modifiche al nome della finestra figlio", ma come evitarlo? semplicemente ignorando gli stessi ricorrenti "titoli delle finestre" nella richiamata? – JohnTube

+1

Se ti interessano solo le modifiche in un processo, puoi specificare l'ID del processo nella chiamata "SetWindowEventHook', che ridurrà notevolmente il numero di eventi osservati. –

+0

@BrendanMcK Ricevo titoli quando ho cambiato windows, per esempio. da chome> notepad> visualstudio ma non ottenendo come implementare l'evento per il cambio di scheda di chrome o modifica del documento in visualstudio. puoi per favore aiutare? Saluti –

3

Avrete bisogno di un gancio (o la tecnica di polling lei ha citato nella sua interrogazione).

Fondamentalmente nell'API di Windows, per modificare la "finestra didascalia" - o più precisamente il testo di una finestra - si invia WM_SETTEXT, quindi l'hook deve intercettare quel messaggio. Il tipo di amo che vi serve è WH_CALLWNDPROC e basta controllare se il messaggio che stai ricevendo è WM_SETTEXT e la hWnd è la finestra principale per l'applicazione che si sta guardando (in modo da non ottenere falsi positivi, come l'applicazione cercando di impostare la testo delle finestre per bambini).

Piccola nota qui: Anche se questo non è probabilmente il caso qui, essere consapevoli del fatto che il titolo che si vede in realtà può solo trarre lì manualmente, senza passare attraverso la solita API di Windows. Usa Spy ++ o qualcosa per vedere cosa sta succedendo prima di andare troppo avanti lungo questa rotta, potresti passare molto tempo per niente.

+1

Funzionerà, ma non è il modo più semplice. Il problema con un hook WH_CALLWNDPROC è che avrai bisogno di una DLL C/C++ separata - non puoi fare tutto in C#. (Inoltre avrai bisogno di ganci separati per il codice a 32 e 64 bit, se ti interessa.) SetWinEventHook sarà probabilmente più adatto in questo caso, dal momento che puoi rendere la notifica restituita al tuo processo, evitando la necessità di DLL separata. – BrendanMcK

+0

Hai già postato la tua risposta, perché preoccuparsi di questo commento? – Blindy

+5

In modo che un potenziale lettore SO futuro comprenderà come le due tecniche si relazionano tra loro, o vedrà questo avvertimento anche se l'unica scansione della risposta accettata; un commento ha una migliore localizzazione spaziale rispetto alla risposta separata. – BrendanMcK

-7

Non è necessario alcun gancio. Basta usare finestre eventi

+3

....... come? – LarsTech

+0

@fred, questa non è una risposta molto utile: Windows ha molte funzionalità disponibili che potrebbero essere descritte come eventi. Se cerchi google per "Widows Events", ottieni un hit per la registrazione degli eventi di Windows come prima corrispondenza, che è una tecnologia totalmente indipendente. Almeno dai un nome API o simile - preferibilmente con un link - in modo che il lettore capisca di cosa stai parlando. – BrendanMcK