Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ MFC]processi e hide mode

    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

  2. #2
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Ho dei problemi a utilizzare la enumwindows:
    ho provato questo:
    codice:
    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.

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Ho provato cosi:
    codice:
    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

  6. #6
    Hai dichiarato MyEnumProc prima di OnBnClickedOk?
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie , tutto ok , solo non trovo GetWindowProcessID cosa posso usare al suo posto?
    Grazie.

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    La ufnzione si trova in windows.h
    E' incluso nel progetto?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Forse e' la

    GetWindowThreadProcessId

    ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    [code]
    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]



    codice:
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.