Fenster eines Administrator-Benutzers maximieren



  • Ich habe zwei Projekte. Das erste wird als Administrator ausgeführt und erstellt ganz einfach ein Fenster:

    #include "stdafx.h"
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
    {
    	WNDCLASSEX wcex = {0};
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style = CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc = WndProc;
    	wcex.hInstance = hInstance;
    	wcex.lpszClassName = L"Test";
    
    	RegisterClassExW(&wcex);
    
    	HWND hWnd = CreateWindow(L"Test", L"Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    
    	ShowWindow(hWnd, nCmdShow);
    	UpdateWindow(hWnd);
    
        MSG msg;
    
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {	
    		case WM_CREATE:
    		{
    			ChangeWindowMessageFilterEx(hWnd, WM_SHOWWINDOW, MSGFLT_ALLOW, nullptr);
    
    			return 0;
    		}
    
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    
    			break;
    		}
    
    		default:
    		{
    			return DefWindowProc(hWnd, message, wParam, lParam);
    		}
        }
    
        return 0;
    }
    

    Das zweite wird als normaler Benutzer ohne Administratorrechte ausgeführt und soll das Fenster des ersten Projektes maximieren:

    #include "stdafx.h"
    
    #include <Windows.h>
    
    int main()
    {
    	HWND handle = FindWindow(NULL, L"Test");
    
    	ShowWindow(handle, SW_MAXIMIZE);
    
        return 0;
    }
    

    Um zu bewirken, dass die User Interface Privilege Isolation (UIPI) das ShowWindow aus meiner nicht privilegierten Anwendung akzeptiert, habe ich im ersten Projekt in Zeile 40 den Aufruf von ChangeWindowMessageFilterEx eingefügt. Trotzdem wird das Fenster nicht maximiert. Führe ich hingegen das erste Projekt als unprivilegierter Benutzer aus, wird es maximiert.

    Was muss ich tun, damit meine unprilegierte Anwendung das Fenster der privilegierten Anwendung maximieren darf? Ich würde ungern mit einer Manifest-Datei arbeiten, in der ich "uiAccess=true" setze. Es sollte doch mit ChangeWindowMessageFilterEx auch gehen, oder?



  • versuchs mal mit einer beutzerdefinierten message, so dass sich das fenster selbst minimiert.



  • Gute Idee! Hab es ausprobiert und es funktioniert. Ich muss bloß per ChangeWindowMessageFilterEx die Nachricht WM_USER erlauben. Die kommt dann durch.

    Weiß jemand, wieso es in meinem ursprünglichen Beispiel nicht geht?



  • Weiß keiner Rat?



  • Bist du sicher, dass ChangeWindowMessageFilterEx auch immer funktioniert, weil du den Rückgabewert gar nicht überprüfst. 😕



  • Guter Punkt. Hab das gerade überprüft: Ja, er gibt 1 zurück, was laut Dokumentation "Erfolg" bedeutet:

    https://msdn.microsoft.com/de-de/library/windows/desktop/dd388202(v=vs.85).aspx schrieb:

    If the function succeeds, it returns TRUE



  • Ich denke nicht, dass auf dem Weg irgendwelche Nachrichten überhaupt an das Fenster gesendet werden. Du kannst ja mal den Returnwert von ShowWindow prüfen und im Fehlerfall GetLastError abfragen. Mit ziemlicher Sicherheit ist er 5 -> access denied.

    Auch wenn ich dein Problem wohl nicht richtig verstehe (bzw. warum ein Adminfenster überhaupt von einem Prozess mit weniger Rechten gesteuert werden soll), könnte es mit WM_SYSCOMMAND klappen.
    Also die Nachricht zulassen und in der Konsolenanwendung dann PostMessage(/*wnd*/,WM_SYSCOMMAND,SC_MAXIMIZE,0);



  • Ich würde mal vermuten dass es daran liegt, dass ShowWindow nicht einfach ne WM_SHOWWINDOW Message sendet. Das macht viel mehr kranke Magic.

    Sämtliche Dinge die letztendlich die Position/Z-Order/... eines Fensters ändern werden nicht vom Fenster selbst, sondern vom Window-Manager erledigt. Das Fenster wird dann bloss netterweise mittels diverser Nachrichten darüber informiert.


  • Mod

    Löse es anders:
    Sende eine registrierte/private Nachricht an Dein Fenster, dass sich dann selber sichtbar macht.

    Ich gehe konform mit der Aussage von hustbaer, ShowWindow macht viele üble Sachen und einiges an Schweinskram mit dem nicht rechnet...


Anmelden zum Antworten