PDA

Visualizza la versione completa : [c++ MFC]processi e hide mode


giuseppe500
09-12-2008, 17:12
Ciao.
Ho utilizzato le funzioni Process32First e Process32Next per enumerare i processi.
Ora vorrei scoprire se un processo in hidemode, ovvero la sua gui invisibile.
Grazie

MItaly
09-12-2008, 18:00
Devi enumerare tutte le finestre di primo livello aperte nel sistema con la EnumWindows, ottenerne il PID con GetWindowProcessID per associarle con ciascun processo e verificare se sono visibili con la IsWindowVisible.

giuseppe500
10-12-2008, 16:50
Ho dei problemi a utilizzare la enumwindows:
ho provato questo:


void CprocessDlg::OnBnClickedOk()
{
EnumWindows(((WNDENUMPROC)MyEnumProc),NULL);
}

BOOL CALLBACK CprocessDlg::MyEnumProc(HWND hWnd, LPARAM lParam) {
char title[500];
::GetWindowText(hWnd, title, sizeof(title));
return TRUE;
}


questo l'errore
c:\Documents and Settings\frg\Documenti\Visual Studio Projects\process\process\processDlg.cpp(163): error C2664: 'EnumWindows' : cannot convert parameter 1 from 'BOOL (HWND,LPARAM)' to 'WNDENUMPROC'
grazie.

MItaly
10-12-2008, 20:54
Le procedure callback delle API di Windows non possono essere metodi d'istanza di una classe; in molti compilatori possono essere metodi statici, ma lo standard non ti garantisce niente in questo senso. L'unico modo sicuro usare una normale funzione fuori da classi.

giuseppe500
11-12-2008, 12:04
Ho provato cosi:


void CprocessDlg::OnBnClickedOk()
{
EnumWindows(::MyEnumProc,NULL);
}

BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam) {

int i=33;
i=44;
char title[500];
HWND hWnd1;
::GetWindowText(hWnd1, title, sizeof(title));
return TRUE;
}


dove CprocessDlg una classe cdialog .
Al premere del pulsante vorrei enumerare i processi ...ma, cosi ' mi da questi errori:


c:\Documents and Settings\frg\Documenti\Visual Studio Projects\process\process\processDlg.cpp(163): error C2039: 'MyEnumProc' : is not a member of 'operator``global namespace'''
c:\Documents and Settings\frg\Documenti\Visual Studio Projects\process\process\processDlg.cpp(163): error C2065: 'MyEnumProc' : undeclared identifier

MItaly
11-12-2008, 15:53
Hai dichiarato MyEnumProc prima di OnBnClickedOk?

giuseppe500
11-12-2008, 17:21
grazie , tutto ok , solo non trovo GetWindowProcessID cosa posso usare al suo posto?
Grazie.

XWolverineX
11-12-2008, 19:47
La ufnzione si trova in windows.h
E' incluso nel progetto?

oregon
11-12-2008, 19:52
Forse e' la

GetWindowThreadProcessId

...

giuseppe500
15-12-2008, 09:35
grazie.


BOOL CALLBACK MyEnumProc(HWND hWnd, LPARAM lParam) {

char* title = NULL;
DWORD dwId;
::GetWindowThreadProcessId(hWnd,&dwId);
CString str;
if(oldH != hWnd)
if(dwId==(DWORD)lParam && dwId!=0)
{ if(::IsWindowVisible(hWnd) )
{
int n = GetWindowText(hWnd,title,1000);
AfxMessageBox(title);
AfxMessageBox("Istanza trovata , visibile ");

}
else
{
AfxMessageBox("Istanza trovata , non visibile ");
}
dwId=0;
oldH= hWnd;
}
return TRUE;
}
[code]



[code]
EnumWindows(::MyEnumProc,(LPARAM)DWProcessID);//dove dwprocessid l'id del mio provesso



il problema che si verifica piu di un occorrenza di MyEnumProc con lo stesso id di processo,come se ci fossero molteplici finestre aperte per il mio processo.
grazie.

Loading