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 fordergrundBOOL 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 gehnBOOL 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.