Fensterhandle anhand Exe-Datei



  • Hallo,

    weiß jemand wie ich anhand des namens der exe-datei prüfen kann, ob eine Applikation bereits läuft, das fensterhandle davon bekomme und das fenster dann in den vordergrund bringen kann?

    MfG
    Don



  • wie willst du es prüfen ob die *.exe läuft von ausen durch ein anderes programm? oder intern in deinem project durch code

    extern würde es mehrere möglichkeiten geben

    intern wäre die günzigste

    HANDLE hMutex = ::CreateMutex(NULL, TRUE, "NamedeinerAnwendung");//<-- Name kann auch ein andere sein	
    
    if(GetLastError() != ERROR_SUCCESS)
    {
    	MessageBox(0, "Process läuft bereits", "Warnung",MB_ICONWARNING);
    	return 0;
    }
    

    NEW EDIT:
    hab heut irgendwas auf den augen
    folgender code sucht dir ein fenster mit einem bestimmten titel und bringt es in den fordergrund

    BOOL CBlub::WindowHandle(CString sWindow)
    {
    	HWND hwnd = GetForegroundWindow()->GetSafeHwnd();
    	CWnd cWnd;
    	CString wndtext;
    	BOOL bWhile = TRUE;
    
    	while(bWhile)//Durchlaufe die  Fenster Array 
    	{
    		hwnd = ::GetNextWindow(hwnd,GW_HWNDNEXT);//Handle auf das nächste Fenster
    
    		if(!IsWindow(hwnd))//Ist das Handle ungültig
    			break;
    		if (::IsWindowVisible(hwnd))
    		{
    			cWnd.Attach(hwnd);//
    			cWnd.GetWindowText(wndtext);//Fenster Title holen
    
    			if(sWindow == wndtext)
    			{
    				bWhile = FALSE;
    				::SetForegroundWindow(hwnd);//Bzw.
    				//cWnd.SetForegroundWindow();
    			}
    
    		}
    		cWnd.Detach();
    	}
    
    	cWnd.Detach();//Gib das fenster wieder frei
    return TRUE;
    }
    

    NEW NEW EDIT:
    nur mit dem exenamen würde es so gehn

    BOOL CBlub::WindowHandle(TCHAR szExeName)
    {
    	HWND hwnd = GetForegroundWindow()->GetSafeHwnd();
    	CWnd cWnd;
    	CString wndtext;
    	DWORD processID;
    	BOOL bWhile = TRUE;
    
    	while(bWhile)//Durchlaufe die  Fenster Array 
    	{
    		hwnd = ::GetNextWindow(hwnd,GW_HWNDNEXT);//Handle auf das nächste Fenster
    
    		if(!IsWindow(hwnd))//Ist das Handle ungültig
    			break;
    		if (::IsWindowVisible(hwnd))
    		{
    			cWnd.Attach(hwnd);//
    			GetWindowThreadProcessId(cWnd.GetSafeHwnd(),&processID);
    
    			if(GetProcessExeName(szExeName, processID))
    			{
    				bWhile = FALSE;
    				::SetForegroundWindow(hwnd);//Bzw.
    				//cWnd.SetForegroundWindow();
    			}
    
    		}
    		cWnd.Detach();
    	}
    
    	cWnd.Detach();//Gib das fenster wieder frei
    
    }
    
    BOOL Blub::GetProcessExeName(TCHAR exename, DWORD dwprocess)
    {
    	HANDLE handle ;
    	PROCESSENTRY32 *process;
    	process->dwSize = sizeof(PROCESSENTRY32);
    	handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    	if(Process32First(handle, process))
    	{
    		do
    		{
    			if(strcmpi(process->szExeFile, exename) == 0
    				&& process->th32ProcessID == dwprocess)
    			{
    				CloseHandle(handle);
    				return true;
    			}
    		}while(Process32Next(handle, process));
    	}
    
    	CloseHandle(handle);
    	return false;
    }
    

    kann auch sein das du unter GetProcessExeName beim ProcessID vergleich mit
    process->th32ParentProcessID arbeiten must. hab das schon länger nicht mehr gemacht.

    ob es nen weg über die processid an ein fensterhandle zukommen gibt weis ich nicht. wäre aber sogesehn dann einfacher.



  • Danke!!!
    Leider steht in szExeFile immer nur [System Process] und kein richtiger Dateiname... 😕



  • wie unten folgt hab ich es jetzt nochmal überarbeitet und bis zur MessageBox(""); funzt es und wenn bei dir nur [System Process] angezeigt wird hast du glaub ich

    if(strcmpi(process->szExeFile, exename) == 0
    

    mit != nur dann zeigts bei mir [System Process] an.

    BOOL C...Dlg::WindowHandle(CString sExe) 
    { 
        HWND hwnd = GetForegroundWindow()->GetSafeHwnd(); 
        CWnd cWnd; 
        CString wndtext; 
        DWORD processID; 
        BOOL bWhile = TRUE; 
    
        while(bWhile)//Durchlaufe die  Fenster Array 
        { 
            hwnd = ::GetNextWindow(hwnd,GW_HWNDNEXT);//Handle auf das nächste Fenster 
    
            if(!IsWindow(hwnd))//Ist das Handle ungültig 
                break; 
            if (::IsWindowVisible(hwnd)) 
            { 
                cWnd.Attach(hwnd);// 
                GetWindowThreadProcessId(cWnd.GetSafeHwnd(),&processID); 
    
                if(GetProcessExeName(sExe, processID)) 
                { 
    		MessageBox("");
                    //bWhile = FALSE; 
    		//::SetForegroundWindow(hwnd);//Bzw. 
    /**/            //cWnd.SetForegroundWindow(); 
                } 
    
    	Sleep(500);
            } 
            cWnd.Detach(); 
        } 
    
        cWnd.Detach();//Gib das fenster wieder frei 
    return TRUE;
    } 
    
    BOOL C...Dlg::GetProcessExeName(CString sExe, DWORD dwprocess) 
    { 
    	HANDLE			hProcess   = NULL; 
    	PROCESSENTRY32  ProcEntry   = { sizeof(PROCESSENTRY32) }; 
    	hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    
    	BOOL bFirstProcess = FALSE;
    
    	if (Process32First(hProcess, &ProcEntry)) 
    	{ 
    		do 
    		{ 
    			if (!strcmp(ProcEntry.szExeFile, sExe)
    				&& ProcEntry.th32ParentProcessID == dwprocess)
    				return TRUE;
    
    		} while (Process32Next(hProcess, &ProcEntry));
    
    	CloseHandle(hProcess); 
    	}
    	return FALSE;
    }
    


  • Danke jetzt funktionierts!!!
    ich hab das cWnd.Attach(hwnd) vergessen :xmas2:



  • @LowFly: Hat es einen bestimmten Grund, daß du zu ständig zwischen Handles und CWnds wechselst? Die meisten CWnd-Methoden sind sowieso nur ein Wrapper um eine gleichnamige WinAPI-Funktion für Handles, als kannst du z.B. statt

    cWnd.Attach(hwnd);
    cWnd.GetWindowText(wndtext);//Fenster Title holen
    

    auch direkt die WinAPI-Funktionen nutzen:

    ::GetWindowText(hwnd,wndtext.GetBuffer(len),len);
    


  • @CStoll jo hatte es(grund), da ich in meinem tool CWnd gebraucht habe und ich die 2 functionen für MastaEda zusammengeschrieben hab, sind da fragmente übriggeblieben 😉 hoffe du kannst mir verzeihen das fragmente aus meinem codewirrwar enthalten sind.

    natürlich hast du recht es geht auch einfacher mit GetWindowText aber dann solltest du ihr auch verraten das sie mit

    len = GetWindowTextLength(hWnd);
    

    an die gesuchte länge kommt die sie für GetWindowText hier braucht.


Anmelden zum Antworten