kann window nicht finden



  • ...aber EnumWindows findet es unter Garantie!

    Dann noch den Namen der EXE inkl. kompletten Pfad herausfinden:

    // Benötigt psapi.lib und psapi.h
    // Läuft nur auf WinNT-basierenden Betriebssystemen!
    // (also WinNT, Windows2000, WindowsXP)
    
    void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
    {
        DWORD lpdwProcessId; 
        HANDLE hProcessHandle;
        GetWindowThreadProcessId(hWnd, &lpdwProcessId);	
        hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
        GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
        CloseHandle(hProcessHandle);
    }
    

    Aufrufen tuste das in der EnumProc (welche zu EnumWindows() gehört):

    BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
    {
        char szProgrammEXE[MAX_PATH];
        GetPathFromHandle(hwnd, szProgrammEXE);
        if (stricmp(szDasZuSuchendeProgramm, szProgrammEXE)==NULL) 
        {
            SendMessage(hwnd, WM_CLOSE, NULL, NULL);
            return FALSE;
        }
        return TRUE;
    }
    

    ...und schon wird die EXE beendet, sauber und komplett...



  • des is doch voll kompliziert...und gibts nicht ein code, der auch auf win98 funktioniert?
    den filename hab ich ja!
    ich will einfach nur meine tools.exe (das ist der name) abbrechen, damit das file überschrieben werden kann, und der zusatzeffekt ist dann, dass sie nur einmal gestartet sein kann.
    ich mach CreateMutex, damit kann ich rausfinden, ob sie an ist oder nicht.
    Mir ist es egal, ob das jetzt schön geschlossen ist oder nicht, bis jetzt musste ich sie immer mitm taskmgr schliesen.
    ich will einfach nur die tools.exe abbrechen, damit man sie wieder überschreiben kann.
    und ich weiß nicht wo ich die ganzen hwnds herbekommen soll, wenn ich des jetzt in enumproc schreiben würde, da muss doch was drinstehen, aber ich weiß eben nicht was?!



  • Ein Programm der Qualität

    int main()
    {
    
    int x=3
    for (;;)
    {
    }
    exit 0
    }
    

    in einem anderen Program gestartet mit

    unsigned long int SpawnWaitNoWindow(char *AppName,char *CmdLine) 
    { 
      char szCmdLine[LONGSTRINGLEN]; 
      PROCESS_INFORMATION pi; 
      STARTUPINFO si={sizeof(si)};  // da der erste Parameter gefüllt wird werden zumindest ab Visual C 5.0 alle anderen genullt 
      unsigned long int dwExitCode; 
      BOOL fSucess; 
      sprintf(szCmdLine,"%s %s",AppName,CmdLine); 
      fSucess=CreateProcess(AppName,szCmdLine,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si ,&pi); 
      if (fSucess) 
      { 
        CloseHandle(pi.hThread); 
        WaitForSingleObject(pi.hProcess,INFINITE); 
        GetExitCodeProcess(pi.hProcess,&dwExitCode); 
        CloseHandle(pi.hProcess); 
      } 
      else 
        return 0xFFFFFFFFL; 
      return dwExitCode;
    

    }

    CREATE_NO_WINDOW Windows NT/2000 or later: This flag is valid only when starting a console application. If set, the console application is run without a console window.

    Wie soll ich dieses aus einem dritten Programm beenden, wobei dieses dritte Programm keinen Zugriff auf die Daten in pi hat?

    I



  • crash0r schrieb:

    des is doch voll kompliziert...und gibts nicht ein code, der auch auf win98 funktioniert?

    Natürlich gibt es entsprechende Equivalente, die auch unter Win9x funktionieren.

    Aber Du erwartest doch nicht im Ernst, das wir Dir hier komplett fertigen Code schreiben, oder?

    Kann ich gerne tun, mein Stundensatz liegt bei 130,- EUR...

    Minimum müßte ich 2 Stunden veranschlagen... kannst Du Dir das leisten? Ich fürchte nicht....

    Also, den Weg hab ich Dir gezeigt, beschreite ihn!



  • mit dem script startet man doch auch erst den prozess um ihn danach wieder zu schliesen.
    also nochmal: ich habe ein programm das am laufen ist. Und der prozess soll einfach von einem anderen programm, das den programmpfad der laufenden exe kennt, terminiert werden. Also muss da sowas ähnliches wie FindWindow oder so rein, dass der die pid findet, damit er den schliesen kann. FindWindow geht aber nicht, da das programm im hintergrund läuft (oder irre ich mich und das geht nur bei mir nicht?).
    Und ich hab kein handle oder sonst was, ich will einfach nur des billige programm terminieren.



  • @ crash0r

    wenn du dich auf PAD von 20:26 Uhr beziehst:

    Das erste ist ein simples C Programm (name prog1) das sich nicht selbst beendet,da es eine endlos Schleife enthält.

    Das wird aus einem C-Program (name prog2) mit der SpawnWaitNoWindow Function gestartet, dieses wartet darauf das sich prog1 beendet, was es aber nicht tut und somit ist prog2 blockiert, da der Aufruf im Hauptthread ist.

    Jetzt will ich prog1 von einem dritten Progamm (name controllator) aus beenden.

    Hoffentlich habe ich das jetzt ein bisschen klarer dargestellt.

    ➡ Sorry adressat war nicht crash0r sondern Hepi



  • mir schon klar, aber ich habe das gelesen:

    PAD schrieb:

    CREATE_NO_WINDOW Windows NT/2000 or later: This flag is valid only when starting a console application. If set, the console application is run without a console window.



  • @ Hepi

    😃 😃 😃 Mach die Preise nicht kaputt 😃 😃 😃



  • Hepi schrieb:

    Aber Du erwartest doch nicht im Ernst, das wir Dir hier komplett fertigen Code schreiben, oder?

    Nein, sowas hat er nie behauptet!

    Hepi schrieb:

    Kann ich gerne tun, mein Stundensatz liegt bei 130,- EUR...
    Minimum müßte ich 2 Stunden veranschlagen... kannst Du Dir das leisten? Ich fürchte nicht....

    Du bist echt panne, Junge. Ein absoluter Vollpfosten! Ganz nebenbei entspricht der Preis auch nicht deiner Qualität.

    Hepi schrieb:

    Also, den Weg hab ich Dir gezeigt, beschreite ihn!

    Hast du? Dann schau nochmal richtig hin!



  • endlich einer der meine Frage versteht 🙂


Anmelden zum Antworten