Showwindow / Sendmessage UIPermissionWindow Problem ?

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von 325Chris.

    Showwindow / Sendmessage UIPermissionWindow Problem ?

    Hi Leutz.......

    Nachdem ich nun über einer Woche am recherchieren und verzweifeln bin, weil nix zu finden ist wo schonmal jemand das gleiche Problem hatte anscheinend, hab ich mich nun letztendlich doch entschlossen mich hier anzumelden und mal die zu fragen, die sich damit auskennen, gg.

    Kurz zu mir, ich bin "GelegenheitsProgrammierer", damals ein paar Programme in Amiga Basic, dann ne Weile nix, die letzten Jahre öfters mal komplexere Batchprogramme / Tools, bis ich nun seit nen paar Monaten bei VB.net gelandet bin, weil ich dann doch irgendwann mal ne grafische Oberfläche haben wollte, gg....lange Rede, kein Sinn, nun zu meinem Problemchen, was sich als harte Nuss für mich erwiesen hat:

    Und zwar habe ich eine externe Anwendung, die mit mehreren UserAccounts arbeitet, jede Instanz läuft als einzelner Process, und hat sein eigenes Fenster, welches sich beim schliessen in das, ab dem Start der Instanz, vorhandene Tray Icon minimiert und darüber wieder vorgeholt werden kann.

    So, das wiederherstellen des Fensters ist für mich nicht das Problem, das richtige Handle von dem Fenster was ich haben möchte habe ich, und Showwindow(hwnd,msg) funxt auch soweit, oder auch per Sendmessage / Restore usw.

    Das eigentliche Problem:

    Das wieder angezeigte Fenster updatet sich nicht von alleine grafisch,
    anwählen von Listeneinträgen werden grafisch nicht ausgeführt ( hinter den Kulissen aber ja, denn per DoppelKlick auf einen jeweiligen ListenEintrag geschieht dann auch das was soll ),
    es ist halt rein das grafische Update was wie gesperrt ist.

    Was sich gar nicht bedienen lässt sind die beiden Buttons minimieren und Schliessen des Fensters.

    Maximieren funktioniert.

    Die Grafik updatet sich wenn eine andere Form drüber lag und weggezogen wird ( aber dann halt nur da wo das andere Fenster drüber lag ).

    Soviel zu den Symptomen.

    Am Ende meiner Recherchen traf ich nun auf folgende Referenz:

    msdn.microsoft.com/en-us/libra…nwindow%28v=vs.90%29.aspx

    und ich vermute es könnte sein, das die Anwendung quasi erstmal wieder "entlockt/freigeschaltet" werden muss, um das der User wieder Zugriff hat.

    Nur bin ich noch zu frisch, um nun zu wissen, wie sende ich der Anwendung / dem Fensterhandle diese Anweisung.

    Ich hoff ihr könnt mir helfen diese Nuss zu knacken....ich würd gern hier endlich weiterkommen wieder mit meinen Sachen.

    Achja, und als Neben(Bonus)frage.....wie / bzw kann man überhaupt, das NotifyIcon einer FremdAnwendung modifizieren ( BS WinXP 32 Bit )

    Ich hätte nämlich gerne bei jedem der im gleich aussehenden NotifyIcons, die Info( beim mit der Maus herrüberfahren), welcher Username das nun ist. Im Moment muss ich erst alle durchklicken und die Fenster öffnen, um zu sehen welchen Username ich nun habe.

    Vielen Dank im Vorraus.

    MfG Chris

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „325Chris“ ()

    Ok, nur ist mir ausser das Handle leider nix klar an der Funktion bisher, steig da nicht durch...

    <DllImport("user32.dll")> _
    Private Shared Function RedrawWindow(ByVal hWnd As IntPtr, ByVal lprcUpdate As IntPtr, ByVal hrgnUpdate As IntPtr, ByVal flags As RedrawWindowFlags) As Boolean
    End Function

    Wäre nett wenn mir das jemand erläutern könnte.

    Hab bisher meinen "Fensteraufruf" per

    ShowWindow(tSkMainForm, 1)

    Der funktioniert, das vorher in den Tray minimierte Fenster erscheint wieder, aber die der "Cursor" updatet sich nicht beim anwählen mit Mausklick von Listboxeinträgen.

    Umschalten des TabReiters hin und her funktioniert. DoppelKlicken funktioniert auch, dann erscheint das richtige Fenster zu dem gewählten ListBoxEintrag.

    MfG Chris
    Hmm die Deklaration dort ist nicht ganz optimal. Die Orginale ist diese

    C-Quellcode

    1. BOOL
    2. _stdcall
    3. RedrawWindow(
    4. __in_opt HWND hWnd,
    5. __in_opt CONST RECT *lprcUpdate,
    6. __in_opt HRGN hrgnUpdate,
    7. __in UINT flags);

    Der erste Parameter ist das Handle des Fensters in VB.Net nehmn wir einfach n IntPtr. Der Zweite ist ein Pointer auf das Rectangle das neugezeichnet werden soll, da du das ganze Window neuzeichnen willst und das optional ist setzes einfach auf Null. Der nächste ist die Region und zu letzt die Flags.
    Spoiler anzeigen

    C-Quellcode

    1. #define RDW_INVALIDATE 0x0001
    2. #define RDW_INTERNALPAINT 0x0002
    3. #define RDW_ERASE 0x0004
    4. #define RDW_VALIDATE 0x0008
    5. #define RDW_NOINTERNALPAINT 0x0010
    6. #define RDW_NOERASE 0x0020
    7. #define RDW_NOCHILDREN 0x0040
    8. #define RDW_ALLCHILDREN 0x0080
    9. #define RDW_UPDATENOW 0x0100
    10. #define RDW_ERASENOW 0x0200
    11. #define RDW_FRAME 0x0400
    12. #define RDW_NOFRAME 0x0800

    VB.NET-Quellcode

    1. <StructLayout(LayoutKind.Sequential)> _
    2. Public Structure RECT
    3. Dim Left As Integer
    4. Dim Top As Integer
    5. Dim Right As Integer
    6. Dim Bottom As Integer
    7. End Structure
    8. Public Enum RDWFlags
    9. RDW_INVALIDATE = &H1
    10. RDW_INTERNALPAINT = &H2
    11. RDW_ERASE = &H4
    12. RDW_VALIDATE = &H8
    13. RDW_NOINTERNALPAINT = &H10
    14. RDW_NOERASE = &H20
    15. RDW_NOCHILDREN = &H40
    16. RDW_ALLCHILDREN = &H80
    17. RDW_UPDATENOW = &H100
    18. RDW_ERASENOW = &H200
    19. RDW_FRAME = &H400
    20. RDW_NOFRAME = &H800
    21. End Enum

    Als Deklaration würd ich diese nehmen

    VB.NET-Quellcode

    1. <DllImport("User32", SetLastError:=True)> _
    2. Shared Function RedrawWindow(ByVal hWnd As IntPtr, ByRef lprcUpdate As RECT, ByVal hrgnUpdate As IntPtr, ByVal flags As RDWFlags) As <MarshalAs(UnmanagedType.Bool)> Boolean
    3. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    Ok, danke, den ersten Teil der Funktion hab ich schonmal verstanden, aber was für Werte bekommen

    hrgnUpdate As IntPtr ( Region ist dann auch mein Fensterhandle ??)


    flags As RDWFlags ( Welche Flags müsste ich benutzen ? All Childs um alles neu zeichnen zu lassen ? )
    Die hRgnUpdate ist die Region, weils Optional ist setzes einfach auf 0 also IntPtr.Zero. Bei den Flags sollte Invalidate reichen, einfach mal rumprobieren.
    InvalidateRect wäre auch eine Möglichkeit.




    Ich hab mich umentschieden. InvalidateRect wär hierfür wohhl geeigneter.

    VB.NET-Quellcode

    1. <DllImport("user32", SetLastError:= True)> _
    2. Shared Function InvalidateRect(ByVal hWnd As IntPtr, <[In]()>ByRef lpRect As Rect, <MarshalAs(UnmanagedType.Bool)> ByVal bErase As Boolean) <MarshalAs(UnmanagedType.Bool> As Boolean
    3. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gonger96“ ()

    Soweit alles verstanden, nur eins noch, wie sag ich den "RECT" Werten das sie Null sein sollen

    RedrawWindow(tSkMainForm, 0, IntPtr.Zero, RDWFlags.RDW_INVALIDATE) will er nich die Null, vbNull auch nicht

    Muss ich hier direkt allen Null zu weisen?

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
    End Structure
    Danke erstmal, leider "Nothing" Erfolg bisher....

    ShowWindow(tSkMainForm, 1)

    RedrawWindow(tSkMainForm, Nothing, IntPtr.Zero, RDWFlags.RDW_INVALIDATE)

    So, oki, damit ist die "Sperre" leider nicht gelöst....habe verschiedene Flags probiert, das gleiche Problem besteht weiterhin.

    Um nochmal auf meinen Ursprungsverdacht zurückzukommen: Mein Problem verhält sich wirklich wie hier beschrieben:

    Als würde die Anwendung SafeTopLevelWindows aktivieren beim "ins Tray NotifyIcon minimieren"

    Wie kann ich es testen dem Fenster ein "AllWindows" zu senden, quasi alles wieder zu "entriegeln" ?

    Oder um vielleicht einen "einfacheren" direkteren Weg zu wählen, wie kann ich "einfach" auf das Menü des dazugehörigen NotifyIcon zugreifen.




    Member nameDescription
    NoWindowsUsers cannot use any windows or user interface events. No user interface can be used.
    SafeSubWindowsUsers can only use SafeSubWindows for drawing, and can only use user input events for user interface within that subwindow. Examples of SafeSubWindows are a MessageBox, common dialog controls, and a control displayed within a browser.
    SafeTopLevelWindowsUsers can only use SafeTopLevelWindows and SafeSubWindows for drawing, and can only use user input events for the user interface within those top-level windows and subwindows. When it runs under SafeTopLevelWindows permission, your application:
    • Will show the DNS name or IP address of the Web site from which the application was loaded in its title bar.
    • Will display Balloon tool-tip when it first displays, informing the user that it is running under a restricted trust level.
    • Must display its title bar at all times.
    • Must display window controls on its forms.
    • Cannot minimize its main window on startup.
    • Cannot move its windows off-screen.
    • Cannot use the Opacity property on Form to make its windows less than 50% transparent.
    • Must use only rectangular windows, and must include the window frame. Windows Forms will not honor setting FormBorderStyle to None.
    • Cannot make windows invisible. Any attempt by the application to set the Visible property on its Form objects to False will be ignored.
    • Must have an entry in the Task Bar.
    • Will have its controls prohibited from accessing the Parent
      property. By implication, controls will also be barred from accessing
      siblings - i.e., other controls at the same level of nesting.
    • Cannot control focus using the Focus method.
    • Will
      have restricted keyboard input access, so that a form or control can
      only access keyboard events for itself and its children.
    • Will
      have restricted mouse coordinate access, so that a form or control can
      only read mouse coordinates if the mouse is over its visible area.
    • Cannot set the TopMost property.
    • Cannot control the z-order of controls on the form using the BringToFront and SendToBack methods.
    These restrictions help prevent potentially harmful code from spoofing attacks, such as imitating trusted system dialogs.

    AllWindowsUsers can use all windows and user input events without restriction.
    Richtig,so als wenn ich quasi doppelklick auf das NotifyIcon mache, oder auch rechte Maustaste und dann in dem Menü des NotifyIcons den Punkt "Öffnen" anwähle.

    Das Fenster wie gesagt bekomm ich ja wieder per ShowWindow oder auch per SendMessage Restore oder oder oder, also da hat so gut wie alles über das Handle funktioniert,

    da das Programm sein Fenster anscheinend nur per HIDE versteckt, aber, halt das Problem mit der "Sperre" dann.....
    Das Handle von dem Fenster ja, das funktioniert ja auch ( bis auf das geschilderte Problem ), das Handle von dem NotifyIcon / dem Menü weiss ich nicht genau wie ich das per "Spy" rausbekomme......

    Wenn ich das Programmfenster, über meine Anwendung ins Notify minimiere / bzw Hide, und wieder anzeigen lasse, dann funktioniert alles wunderbar, dann kann ich es auch ganz normal mit Maus und Tastatur weiterbedienen, doch muss meine Anwendung das Fenster auch bedienbar wieder vorholen können, wenn der Anwender das ProgrammFenster einfach weg "X"t
    Auch leider nicht, also zwischen den 2 Tabs kann ich hin und her wählen, genauso kann ich auf einen der Listbox Einträge doppelklicken und es öffnet sich das dazugehörige Fenster, NUR, bei einem einfachen Klick auf ein ListBox EIntrag stellt sich der Cursor nicht um, genauso kann ich nicht per Tastatur hoch / runter durch die Liste, und von dem Fenster geht der minimize und der CLose Button nicht ( auch wie gesperrt ). Achso, und in dem Fenster ist noch eine Suchleiste wo man was eintragen kann, also quasi eine Textbox, die nimmt zwar das reingeschriebene auf, ABER, stellt es nicht da, also man sieht die Buchstaben nicht die man reinschreibt.


    EDIT: Aber ich werds eben mal noch genauer mit der Enable Funktion unter die Lupe nehmen.....
    EnableWindow hat leider auch nix gebracht.

    Public Declare Function EnableWindow Lib "user32.dll" ( _
    ByVal hwnd As IntPtr, _
    ByVal fEnable As Long) As Long
    EnableWindow(tSkMainForm, 1)


    So, also, ich denk ScreenShots brauch ich nicht senden, jeder kennt Skype, per /secondary als StartArgument starte ich alle meine Accounts, meistens 3, ab und zu verwalte ich noch einen vierten.

    Wenn man das Kontaktlistenfenster schliesst per X, hat man nur noch das NotifyIcon, in meinem Falle dann 3x / 4x das selbe blöde grüne Hakending, wo noch nicht einmal die Info kommt, zu welchem Account das NotifyIcon gehört....darum soll meine Anwendung mir mit einem Klick auf den passenden Usernamen schnell und einfach die Kontaktliste wieder in den Vordergrund befördern, ohne das ich lange rumsuchen muss bei den NotifyIcons......

    Wie gesagt, das Fenster ( die zum Username passende Kontaktliste kommt wieder, allerdings kann ich meine Kontakte nicht mit einem Mausklick links anwählen, bei DoppelKlick allerdings öffnet sich der angewählte Kontakt. Oben drüber kennt jeder die Suchleiste für die Kontakte, die funktioniert und sucht beim eingeben, allerdings stellt sie die Buchstaben nicht dar, und das Fenster lässt sich nicht per Minimize oder Close Button mehr minimieren / schliessen.