FindWindow Alternative

Hi,

gibt es eine simple Alternative zu FindWindow um letztendlich ein Handle auf ein Fenster zu kriegen ?
Also mein Problem ist, ich kenne den Fenstertitel nicht.
Kann ich z.B. mit dem Namen der .exe Datei weiter kommen ?
 
Jo, sobald du ne ThreadId hast, kannste per EnumThreadWindows() alle Fenster durch enumerieren. Und an die kommste, wenn du vom Prozess die Thread durch enumerierst. Kurz: Ja ;)
 
Oh sorry es handelt sich um C++ -.-
Danke für die Antworten ich werde gleich mal nachschauen.

// Edit

Bei der Nutzung von EnumThreadWindows habe ich jetzt nur ein Problem mit der Callback Funktion im zweiten Parameter.
Gut diese Funktion wird jedes mal aufgerufen wenn ein Fenster gefunden wird aber ich weiss nicht genau wie ich diese nun definiere :/
 
Steht alles auf der Seite.. aber was solls., hier mal n Schuss ins Blaue.

Code:
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
   if(hwnd==gesuchtesFensterhandle)
   {
      call_funktion(hwnd);
      return FALSE;
   }
   else
      return TRUE;
}

int main(void)
{
   EnumThreadWindows(ThreadId, (WNDENUMPROC)EnumWindowsProc, NULL);
   [...]
}
 
Kann man sich nicht mit EnumProcesses das Fensterhandle holen ?
Dann muss man vom Handle irgendwie auf den Namen der .exe kommen und vergleichen.
 
Code:
if(hwnd==gesuchtesFensterhandle)
Diesen Vergleich verstehe ich nicht ganz, ich habe lediglich den Prozessnamen der gesuchten Anwendung.
Wenn ich das HWND oder HANDLE von meinem gesuchten Fenster hätte wäre ja alles super :P

Und an EnumProcesses habe ich auch schon gedacht, dann kann ich mir von jedemm Prozess ein HANDLE holen aber vom HANDLE kann ich nicht auf den Prozessnamen schließen xD
 
Threads tut man so durchenumerieren:
http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx CreateToolhelp32Snapshot
http://msdn.microsoft.com/en-us/library/ms686728(VS.85).aspx Thread32First
http://msdn.microsoft.com/en-us/library/ms686731(VS.85).aspx Thread32Next
In der http://msdn.microsoft.com/en-us/library/ms686735(VS.85).aspx steht dann die ProzessId drinne, dafuer holst du dir n Handle mit OpenProcess(), und den Pfad mit http://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx NtQueryInormationProcess() mit ProcessImageFileName als Parameter.

Und woher soll ich bitte wissen, welches Fenster du suchst, irgendwelche konkreten Eigenschaften sollte das schon aufweisen, ansonsten findet man es nicht, von daher kannste den Vergleich durch einen beliebigen von dir ersetzen.
 
Und woher soll ich bitte wissen, welches Fenster du suchst, irgendwelche konkreten Eigenschaften sollte das schon aufweisen, ansonsten findet man es nicht, von daher kannste den Vergleich durch einen beliebigen von dir ersetzen.

Ist allgemein schwierig was zu suchen, von dem man keine Ahnung hat wies aussieht. :D

Als Tipp: Man kann auch den Text _im_ Fenster auslesen und vergleichen.

Wenn er aber den exe Namen und somit die PID kennt, und sein Programm nur ein Fenster besitzt, ist nun wirklich keine Hexerei.
 
Hi, wenn du den Namen der Binary bzw. des Prozesses weißt, hab ich hier eine Funktion, die ich mal vor längerem gemacht habe (für Trainer und einem dll-injection tool)

Code:
unsigned long getpid(char *procname)
{
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
    while(Process32Next(handle, &procinfo))
    {
        if(!strcmp(procinfo.szExeFile, procname))
        {
            CloseHandle(handle);
            return procinfo.th32ProcessID;
        }
    }
    CloseHandle(handle);
    return 0;
}
Mit der Prozess-ID kannst du dann den Prozess öffnen, oder was auch immer du vorhast...

MfG
 
Zurück
Oben