Ho un'applicazione Win32 che determina se sono visibili finestre visibili, non iconiche e minimizzabili. Per quanto ne so, ha funzionato bene per Win9x fino a Win8.1, ma in Windows 10 trova spesso diverse finestre che non sono effettivamente visibili sullo schermo.Come identificare i processi di archivio in background di Windows 10 con finestre non visualizzate che sono visibili e minimizzabili a livello di codice?
Per cercare di identificare cosa sta succedendo ho scritto una semplice applicazione di test che enumera e registra tutte queste finestre. Ecco l'essenza del codice EnumWindows callback:
BOOL CALLBACK EnumFunc(HWND hWnd, LPARAM lParam)
{
if (IsWindowVisible(hWnd))
{
if (!IsIconic(hWnd))
{
const LONG style = GetWindowLong(hWnd, GWL_STYLE);
if (WS_MINIMIZEBOX & style)
{
// record window info
}
}
}
return TRUE;
}
maggior parte delle finestre fantasma sotto Windows 10 appartengono a sfondo memorizzare i processi di applicazioni come Mail, Calcolatrice, e Foto. Questi sono elencati nella sezione Processi in background di Task Manager e, se utilizzo Task Manager per terminare le attività in background, la loro finestra fantasma non viene più trovata dalla mia applicazione di test.
Nella schermata sopra dalla mia applicazione di test si può vedere che tutti, ma 1 delle finestre offendere appartengono al thread dello stesso processo di identificazione 7768, che è ApplicationFrameHost.exe. La finestra finale con ID processo 11808 è explorer.exe.
Ho guardato le finestre fantasma con Spy ++ e non riesco a vedere nessuna particolare combinazione di stili che possa aiutare a identificarli in modo univoco.
che ho avuto un suggerimento che le "bande" senza documenti di Windows possono essere coinvolti, ma ho provato ad utilizzare il (non documentato, quindi questo potrebbe essere sbagliato) API:
BOOL WINAPI GetWindowBand (HWND hWnd, PDWORD pdwBand);
ma restituisce un banda di 1 per qualsiasi finestra, quindi non differenzia questi fantocci.
Come identificare in modo affidabile queste finestre fantasma?
fare quelle finestre capita di condividere la stessa classe di finestra? O forse hanno le stesse proprietà impostate (vedere [EnumProps] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms633562.aspx))? Quando dici che * "l'API non documentata [...] restituisce una banda di 1" *, quale valore sta guardando? Il valore di ritorno 'BOOL', o' DWORD' indicato dal secondo parametro? – IInspectable
Molti (non tutti quelli che ho incontrato) hanno lo stesso nome di classe della finestra, ma quando le applicazioni sono in esecuzione normalmente visibili sullo schermo, hanno ancora lo stesso nome di classe. –
Per quanto riguarda la chiamata GetWindowBand, il valore di ritorno BOOL è sempre diverso da zero e il numero "banda" nel parametro pointer DWORD è sempre 1. –