vb.net - ShowWindowAsync () Vis ikke skjult vindue (SW\_SHOW)

Indlæg af Hanne Mølgaard Plasc

Problem



Hej
jeg bruger Visual Basic 2008


Her er en del af min kode:


    Private Const SW\_HIDE As Integer = 0
    Private Const SW\_SHOW As Integer = 5

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> \_
     Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
        End Function


knappen1 kode:


            Try
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW\_HIDE)
            Catch ex As Exception
               MsgBox("error")
            End Try      


knappen2 kode:


            Try         
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW\_SHOW)
            Catch ex As Exception
               MsgBox("error")
            End Try  


når jeg klikker på button 1 (for at skjule vinduet) fungerer det godt, men så når jeg vil vise vinduet tilbage (ved at klikke på button 2) returnerer funktionen FALSE, hvem kan fortælle mig hvorfor ? og hvordan man får det til arbejde, for at skjule vinduet og derefter vise det igen?

Bedste reference


Fordi ShowWindowAsync() returnerer nul, når vinduet tidligere var gemt i henhold til MSDN-dokumentationen, og nul fortolkes som FALSE. Returværdien angiver ikke, om funktionen lykkes eller ej. [28]


Så første gang du ringer ShowWindowAsync(mwh, SW\_HIDE) på et synligt vindue, returnerer funktionen TRUE fordi ShowWindowAsync() returnerer en ikke-nulværdi, der angiver vinduet (det er nu/vil blive gemt) plejede at være synlig.


Derefter returneres det andet opkald ShowWindowAsync(mwh, SW\_SHOW) på et skjult vindue FALSE fordi ShowWindowAsync() returnerer en nulværdi, der angiver vinduet (det er nu/vil være synligt), der tidligere var skjult.


Det betyder med andre ord, at funktionen skal fungere efter hensigten (medmindre vinduet mwh ikke reagerer på meddelelser eller er ugyldigt.


Men det reelle problem her er, at når du gemmer et vindue, har Process::MainWindowHandle ikke håndtaget længere. [29]



  En proces har et hovedvindue forbundet
  med det kun hvis processen har en
  grafisk grænseflade. Hvis den tilknyttede
  proces har ikke et hovedvindue
  MainWindowHandle-værdien er nul.
   Værdien er også nul for processer
  der er blevet skjult, det vil sige
  processer, der ikke er synlige i
  proceslinjen.
Dette kan være tilfældet for
  processer, der vises som ikoner i
  Anmeldelsesområde, helt til højre for
  proceslinjen.



Hvad du skal gøre er at få vindueshåndtaget via p(0).MainWindowHandle en gang og gem det tilbagevendte håndtag et sted, så du kan vise/skjule vinduet. Selvfølgelig skal du sørge for, at du nulmer det gemte håndtag, når vinduet bliver ødelagt af målprocessen. I Notesblok s tilfælde kan du bruge Process::Exited hændelsen. [30]

Andre referencer 1


Det lyder som 'af design'. Du må ikke behandle returværdien af ​​'false' som en fejl.


Som pr MSDN:


If the window was previously visible, the return value is nonzero.

If the window was previously hidden, the return value is zero. 


http://msdn.microsoft.com/en-us/library/ms633549\%28VS.85\%29.aspx[31]


Du kan sandsynligvis blokere undtagelsen fra at forekomme ved at erklære interop-importen af ​​funktionen som en 32-bit heltalstype i stedet for en boolsk.


Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer

Andre referencer 2


Når jeg skjulte det gjorde jeg:


WindowHandle = Proc(0).MainWindowHandle
ShowWindowAsync(Proc(0).MainWindowHandle, ShowWindowConstants.SW\_HIDE)


Så da jeg viste, brugte jeg WindowHandle variablen:


ShowWindowAsync(WindowHandle, ShowWindowConstants.SW\_SHOW)

Andre referencer 3


For at maksimere et skjult vindue i en anden proces skal du gøre dette 3 trin (meget let):


1- Få MainWindowHandle
Da applikationen er skjult, er MainWindowHandle 0 (false). For at overvinde dette problem kan du bruge FindWindow


//Get the MainWindowHandle
IntPtr hwnd = FindWindow(null, <WINDOW TITLE>);


2- Brug ShowWindowAsync ()


bool result = ShowWindowAsync(hwnd, 3); //3= Maximize application


3- Implementér en af ​​disse applikationsbegivenheder: 'GotFocus', 'Activated' eller 'IsVisibleChanged'
  (Jeg testede kun den 'Aktiverede' begivenhed)


private void WindowApplication\_Activated(object sender, EventArgs e)
{
    Application.Current.MainWindow.Show();
}


Du kan finde flere oplysninger om denne webadresse:
http://isolvable.blogspot.pt/2009/09/restoring-wpf-window-of-another-process.html[32]


Håber, at disse oplysninger kan hjælpe nogen!