Taskbar Notification Area Infotray oder Infoleiste --- aktualisieren

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    :!: Hiermit berufe ich mich wieder auf meinen Amateurstatus :!: sodala...

    Erstens. Per WM_MOUSEMOVE Event, kann man nur die Sichtbaren Icons visuell bereinigen. Wenn es sich um ein ausgeblendetes Icon handelt ("Nur Benachrichtigungen anzeigen"), dann ist das Icon in keinem Sichtbaren Bereich, wo die Mausdrüber ziehen könnte. Es ist also nur eine Notlösung mit Teilzeiteffekt.

    Aber das wissen wir ja, und deshalb habe ich natürlich auch versucht, diesen Workaround umzusetzen ^^

    Leider beisse ich mir daran aber die Zähne aus :( - habe gestern bis es aus meinem Kopf geraucht hat, und googles Hilfe versucht, ohne hier im Forum wegen jeder Kleinigkeit lästig zu sein, es zu packen. Leider nur mit Teilerfolg.

    Nur mit folgendem Code bekomme ich den Handle der Infobar: (weiß auch nicht warum - scheint aber zu klappen)

    Quellcode

    1. Dim Result As IntPtr = FindWindow("shell_traywnd", vbNullString)
    2. Result = FindWindowEx(Result, IntPtr.Zero, "TrayNotifyWnd", vbNullString)
    3. Result = FindWindowEx(Result, IntPtr.Zero, "SysPager", vbNullString)
    4. Result = FindWindowEx(Result, IntPtr.Zero, "ToolbarWindow32", vbNullString)

    Den Beweis erhalte ich, weil ich mit folgender Zeile die genauen Koordinaten erhalte:

    Quellcode

    1. Dim xyxy = New RECT
    2. GetWindowRect(Result, xyxy)

    Und dann habe ich mich schon total gefreut, und dachte jetzt fehlt nur noch das Post, oder SendMessage von WM_MOUSEMOVE. Ich habe mir eine schöne kleine Doppelschleife gegönnt, welche den gesamten Fensterinhalt, in mehreren Zeilen scannt und jeweils ein PostMessage absetzt:

    Quellcode

    1. Dim x As Integer = xyxy.Left
    2. Dim y As Integer = xyxy.Top
    3. Dim u As Integer
    4. Do 'Zeilenloop
    5. y += 10
    6. Do 'Spaltenloop
    7. x += 5
    8. 'MsgBox("x: " & CStr(x) & " y: " & CStr(y))
    9. u = (y << 16) + x
    10. If MsgBox(u, vbOKCancel) = vbCancel Then Exit Do
    11. PostMessage(Result, WM_MOUSEMOVE, 0, u)
    12. Loop While (x < xyxy.Right - 5)
    13. x = xyxy.Left
    14. Loop While (y < xyxy.Bottom - 10)
    15. xyxy = Nothing

    NUR LEIDER OHNE ERFOLG! X(
    Aber da ich ja ein Amateur-Fuzzi bin, hoffe ich auf eure Analyse und evtl. komme ich dann doch noch ans Ziel!

    PS: Ich habe 3 Monitore. Aber in geordneter Reihenfolge von links nach rechts. Und die Pixel die ich in RECT erhalte, entsprechen tatsächlich dem Bereich, wo sich meine "Uhrzeit Infotray-Bar" auch befindet.Viele Grüße,
    Hinti

    sonne75 schrieb:

    Heisst es nicht SendMessage und nicht PostMessage?

    Macht keinen Unterschied. Geht beides nicht. PostMessage "quewed" lediglich die Befehle. Also setzt sie ab und Windoof arbeitet sie bei nächster Gelegenheit ab. Während SendMessage auf ein Ergebnis wartet. So ungefähr.

    Vielleicht liegt mein Problem im LoWord/HiWord kombinieren. Das kann ich nicht so recht prüfen, da ich mich mit Bitoperationen bisher noch nie auseinandergesetzt habe :?:
    Hast du deine Schleifen durchgesteppt? Was funktioniert genau nicht? Kommt er überhaupt zum PostMessage-Befehl hin und hat da richtige Koordinaten in dem Moment?

    EDIT: was sollte das bewirken?

    VB.NET-Quellcode

    1. u = (y << 16) + x


    Du kannst doch Haltepunkt dahin setzen und anschauen, was da gerechnet wird.

    sonne75 schrieb:

    Hast du deine Schleifen durchgesteppt? Was funktioniert genau nicht? Kommt er überhaupt zum PostMessage-Befehl hin und hat da richtige Koordinaten in dem Moment?
    Ja. Die erste MsgBox nach der Zeile "x += 5", enthält ein korrektes X und Y. "u" ist mir dann wieder ein kleines Rätsel. Siehe letzte Antwort. Aber ich habe "u" auch schon als Typ "long" definiert. Ändert auch nichts.
    Na ja. Irgendwie muss ja x + y kombiniert werden. an WM_MOUSEMOVE wird ein DWord übergeben deren LowWord x und HighWord y ist.

    In deinem link den du mir gestern geschickt hast, auf Seite 2, wird das so gemacht. Wie gesagt, ich bin mir auch nicht sicher was ich da tue. Aber x + y müssen bitversetzt in einer Variable stehen!

    - So verstehe ich das halt :|