CreateProcess Explorer.exe -> topmost



  • Also, ich vergleiche, wie oben, den Class-Name, aber ich erreiche damit trotzdem nichts.

    Mache ich da noch irgendwo etwas falsch oder ist es überhaupt möglich, das Explorerfenster so zu kontrollieren ??



  • Unter welcher Windows-Version arbeitest du? Der Klassenname, den ich gepostet habe, bezog sich auf WinXP.
    Wenn du MS Visual Studio installiert hast, kannst du mit Spy++ (zu finden im Startmenu unter Tools) die Klassennamen von Fenstern auslesen.
    Bei mir macht der Code keinerlei Probleme, wenn ich SetForegroundWindow aufrufe.



  • Unter Windows 7 mache ich das. Für XP habe ich gerade keine Testmöglichkeit.

    Sorry, hab es echt vergessen zu erwähnen...



  • 😕
    Hast du denn mal SetWindowPos(..) in deinem geposteten Code durch SetForegroundWindow ersetzt?
    Du hast Recht, unter Win7 ist der Klassenname "CabinetWClass". Ich habe keine Probleme bei der Ausführung (unter Xp und 7).



  • Ja, ich habe SetWindowPos und SetForegroundWindow probiert, doch es wird das Explorerfenster bei mir einfach nicht in den Vordergrund gesetzt.

    Meine Vorgehensweise:

    GetWindowsDirectory(szExePath, sizeof(szExePath) / sizeof(TCHAR));
    _tcscpy_s(szExeFile, MAX_PATH, szExePath);
    _tcscat_s(szExeFile, MAX_PATH, _T("\\explorer.exe"));
    
    ZEROINIT(procInf);
    ZEROINIT(si);
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE | STARTF_USESHOWWINDOW;
    si.dwXSize = 800;
    si.dwYSize = 600;
    si.wShowWindow = SW_SHOW;
    
    if (CreateProcess(szExeFile, szExeCmd, NULL, NULL, TRUE, 0, NULL, szExePath, &si, &procInf))
    {
        ::EnumWindows(&EnumWindowsProc, procInf.dwProcessId);
        CloseMyHandle(procInf.hProcess);
        CloseMyHandle(procInf.hThread);
    }
    
    ...
    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
        char szClassName[MAX_PATH] = {0};
        ::GetClassName(hwnd, szClassName, MAX_PATH-1);
    
        if (strcmp(szClassName, "ExploreWClass") == 0 || strcmp(szClassName, "CabinetWClass") == 0)
        {
            SetForegroundWindow(hwnd);
            return FALSE;
        }
    
        return TRUE;
    }
    

    Damit funktioniert es nicht. Habe ich da noch irgendwas vermurkst ??



  • SetForegroundWindow setzt ein Fenster nicht TopMost und funtkioniert auch nur für Fenster des gleichen Prozesses. Siehe hier:
    http://msdn.microsoft.com/en-us/library/ms633539(VS.85).aspx

    SetWindowPos ist schon korrekt, muss aber statt mit

    ::SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    

    mit

    ::SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    

    aufgerufen werden.



  • Das hatte ich ja auch schon geschrieben, klappt aber anscheinend nicht. Du könntest mal eine Kombination aus SetWindowPos mit HWND_TOPMOST und ForceForegroundWindow probieren.

    HWND ForceForegroundWindow(HWND hTo)
    {
    	if(!hTo)
    		return(NULL);
    	HWND hFrom=GetForegroundWindow();
    	if(!hFrom)
    	{
    		SetForegroundWindow(hTo);
    		return(NULL);
    	}
    	if(hTo==hFrom)
    		return(NULL);
    	DWORD pid=GetWindowThreadProcessId(hFrom,0);
    	if (_threadid==pid)
    	{
    		SetForegroundWindow(hTo);
    		return(hFrom);
    	}
    	if(pid)
        {
    		if(!AttachThreadInput(_threadid,pid,true))
    			return(NULL);
    		SetForegroundWindow(hTo);
    		AttachThreadInput(_threadid,pid,false);
        }
    	return(hFrom);
    }
    


  • Also mit SetWindowPos funkioniert es, aber erst ab dem 2. Explorerfenster. Das 1. bleibt davon unberührt (unter XP und 7).

    @Vicious Falcon: werde dein Source mal studieren und durchtesten und melde mich dann nochmal !



  • So, also ich weiß nicht, aber selbst das hilft mir nicht.

    Er setzt ein Explorerfenster in den Vordergrund, wenn schon min. 1 offen ist.
    Das 1. Explorerfenster kann er mir nicht in den Vordergrund setzen.

    Grundsätzlich funktioniert es schon, nur eben noch nicht mit dem allerersten Fenster.
    Ich verstehe jetzt aber noch nicht ganz, wo da der Unterschied liegt:
    - wenn schon min. 1 offen ist, setze ich 1 über das HWND topmost
    - wenn noch keins offen ist, mache ich ja dasselbe, und dieser neue Prozess hat doch ebenso ein HWND zu seinem Fenster !!??

    Was fehlt da noch.... ??

    EDIT: Ich habe noch eine Ergänzung: den Explorer kann man ja per /n dazu bringen, dass er jedes Fenster in einem neuen Prozess startet und diesen dann auch nicht killt.
    Was sich unter XP und 7 auch schon wieder unterschiedlich verhält und SetWindowPos gleich reagiert. 😞



  • Hey Leute,

    also da ich immer noch keine komplette Lösung gefunden habe, muss ich nochmal nerven. 🙂

    Der Vergleich der Fensterklassen + SetWindowPos (wie oben schon gepostet) ist nicht schlecht, aber es funktioniert erst, sobald bereits min. 1 Explorerfenster geöffnet ist.
    Wenn aber noch keins offen ist, findet er kein Fenster mit den angegebenen Fensterklassen !

    Was ist da der Unterschied ? Wieso findet der vorher keine Fenster, erst wenn min. 1 offen ist ?? 😕


Anmelden zum Antworten