Portare la Finestra in primo piano in C# utilizzando l'API Win32
Domanda
Sto scrivendo un'applicazione che deve portare la finestra di un'app esterne al primo piano, e non necessariamente rubare il fuoco (c'è un'impostazione, l'utente può passare a rubare/non rubare il fuoco).
Qual è il modo migliore per andare su questo utilizzando l'API win32?Ho provato SetForeground() ma ruba sempre il focus e non uniforme di lavoro.
Qual è il modo migliore per andare su questo?Ogni pensiero?
Soluzione
SetForegroundWindow dovrebbe rubare il fuoco e ci sono alcuni casi in cui si avrà esito negativo.
SetForegroundWindow funzione mette il thread che ha creato la finestra specificata in primo piano e attiva la finestra.Input da tastiera è diretto verso la finestra
Provare a catturare l'attenzione con SetCapture prima di effettuare la chiamata.Anche prendere in considerazione i diversi modi di portare la finestra in primo piano:SetForeGroundWindow, SetActiveWindow, anche la simulazione di un clic del mouse è possibile fare questo.
Altri suggerimenti
Qual è la differenza tra SetForeGroundWindow, SetActiveWindow, e BringWindowToTop?Sembra come se tutti fanno la stessa cosa.
Secondo MSDN, SetForeGroundWindow attiverà la finestra e diretto il focus della tastiera ad esso.In questo modo si tenta di lavorare anche quando il processo è in background.SetActiveWindow fa la stessa cosa come SetForeGroundWindow, ma non fa niente se l'applicazione non è l'applicazione in primo piano.Infine, BringWindowToTop solo porta finestra verso l'alto, e non cambia il focus della tastiera.
Si può provare il BringWindowToTop funzione per non rubare il fuoco.Io non l'ho usato, ma sembra essere quello che stai cercando.
Avete provato a usare SetWindowPos.Questo è il canonico funzione per lo spostamento, ridimensionamento e l'impostazione di ordine z in Windows.C'è un SWP_NOACTIVATE bandiera che è possibile utilizzare.Guarda http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx.Non l'ho provato su una finestra appartenenti a un altro processo, ma è probabilmente la pena di provare.
SetWindowPos + SWP_NOACTIVATE fa il lavoro.
Si potrebbe utilizzare FindWindow per ottenere l'HWND della finestra, quindi utilizzare il BringWindowToTop funzione di trovare nell'API Win32.