Ho provato un sacco di cose ma non riesco a farlo funzionare in modo coerente tra la mia barra delle applicazioni e altri effetti soprannaturali sulla mia interfaccia utente desktop.Come aggiungere un "hook di Windows" di sistema in modo da essere avvisati della creazione o dell'attivazione di Windows?
Provato prima usando una libreria aperta http://mwinapi.sourceforge.net/. Anche se ha funzionato bene come un livello OO per enumerare finestre e cose. Non è stato possibile eseguire correttamente i ganci
La tappa successiva era Dino E.'s post on Windows Hooks in the .Net framework. Ho finito per scrivere il mio tipo mentre stavo capendo il testo e cercando di farlo funzionare.
La mia intenzione è quella di avere questa applicazione in esecuzione e di essere in grado di registrare tutte le finestre create mentre è in esecuzione. Chiamare tutti i bulbi oculari ...
Aggiornamento: snipped poiché a quanto pare si can't write global windows hooks in .Net/codice gestito (ad eccezione di alcuni bassi del mouse o la tastiera livello ganci)
Quindi sono passato a C++. Ancora tutte le chiamate WinAPI restituiscono gli handle validi ma non vedo la mia funzione filtro chiamata - non sembrano ricevere notifiche. Ancora non funziona ... Qualcuno può individuare l'errore.
void CWinHookFacade::Hook()
{
HMODULE hCurrentDll = LoadLibrary(_T("[Path to my hook dll]"));
m_HookHandle = SetWindowsHookEx(WH_CBT,
FilterFunctionForHook,
hCurrentDll,
0);
if (m_HookHandle == NULL)
{
throw new std::exception("Unable to hook");
}
}
void CWinHookFacade::Unhook()
{
if (!UnhookWindowsHookEx(m_HookHandle))
{
throw new std::exception("Unhook failed!");
}
m_HookHandle = NULL;
}
LRESULT CWinHookFacade::FilterFunctionForHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
switch(code)
{
case HCBT_CREATEWND:
wprintf(_T("Created Window"));
break;
case HCBT_ACTIVATE:
wprintf(_T("Activated Window"));
break;
case HCBT_DESTROYWND:
wprintf(_T("Destroy Window"));
break;
}
}
return CallNextHookEx(m_HookHandle, code, wParam, lParam);
}
exe client chiama il Hook_DLL come questo
int _tmain(int argc, _TCHAR* argv[])
{
CWinHookFacade::Hook();
getchar();
CWinHookFacade::Unhook();
}
Per chiarire: SetWindowsHookEx restituisce un handle valido ogni volta. Inoltre, nel caso qualcuno volesse provare questo, il codice sopra riportato non ha altre dipendenze. Incolla in un file .cs in un progetto vuoto ed esegui. – Gishu