ControlClick wenn nur Handle bekannt ist

  • Hallo,

    ich habe das Problem, dass ich nur das Handle kenne, wie kann ich an ein Control etwas senden bzw. es anklicken, wenn ich nur das handle habe. Hoffentlich könnte ihr mir weiterhelfen.
    Danke.

  • Das vom Button (vom Control), also ich versuche die Buttons/Icons in der TaskNotificationArea, die da bleiben, wenn man einen Prozess über den Task Manager beendet zu löschen. Jedoch habe ich nur das Handle und versuche einen Mausklick an das Icon/Control zu senden damit es verschwindet (weiß nicht ob das funktioniert).

  • Ja genau die meine ich. Danke für die Antwort, aber er gibt mir dann als $hwnd 0x00000000 aus also scheint er das Elternfenster irgendwie nicht zu finden. Aber wenn ich das $hwnd weglasse scheint es zu funktionieren. Nur leider löst es das Problem nicht, das Auto IT Tray Icon bleibt immer noch da, scheinbar verschwindet das wirklich nur bei einem Mouse Move Event genau über dem Icon, leider...

    Das was ich bräuchte wäre genau die Funktionalität die hier http://www.computersecurityarticles.info/security/refre…ification-area/ beschrieben ist, nur in AutoIT. Leider habe ich keine Ahnung wie ich das realisieren soll, ich habe mich mit der WIN API kaum beschäftigt, auch bin ich mir nicht sicher ob der Code das Problem wirklich löst. Funktioniert der Code der im Link beschrieben wird auch wenn die Auto IT Icons versteckt sind bzw. die Taskbar mehrere Zeilen umfasst? Hoffe Ihr könnt mir weiterhelfen, eine Lösung für das Problem wäre denke ich auch für viele andere hilfreich.

    3 Mal editiert, zuletzt von Keman12 (2. April 2011 um 23:45)

  • Gute Idee, aber funktioniert leider nicht, weil die AutoIT Icons auch versteckt sein können und dann gibt mir die Funktion -32000 zurück (dann müsste man die TaskNotifikationArea erst ausklappen und das funktioniert wieder ziemlich schlecht, weil man nicht weiß wie lange der Computer braucht bis die TaskNotifkationArea komplett sichtbar ist und es auch unschöne Effekte mit sich bringt, wenn sich die Area immer auf- und zuklappt). Zudem scheint die Funktion nur bei Window Handles zu funktionieren, bei den Controls gibt er mir Werte an, die nicht stimmen können (die x- und y Positon ist z.B. immer die selbe)

    Einmal editiert, zuletzt von Keman12 (3. April 2011 um 11:56)

  • Hab es mal mit _SendMessage versucht. Die Notification Area wird zwar neugezeichnet, aber das Icon bleibt...

    Spoiler anzeigen
    [autoit]

    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayIconHide", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = WinGetHandle("[CLASS:Shell_TrayWnd]")

    [/autoit] [autoit][/autoit] [autoit]

    For $iX = 1 To 50
    For $iY = 1 To 16
    _SendMessage($hWnd, $WM_MOUSEMOVE, 0, "0x" & Hex($iX, 4) & Hex($iY, 4))
    Next
    Next

    [/autoit]
  • Hm, es gibt ja diese UDF http://www.autoitscript.com/forum/topic/103871-systray-udf/. Jedoch habe ich bei der Variante folgendes Problem/ folgende Frage: Um mit der Funktion das Icon zu löschen muss man zunächst dessen Index auslesen, sobald man diesen hat kann man im 2. Schritt das Icon löschen. Doch was passiert, wenn genau zwischen diesen beiden Befehlen ein neues Icon entsteht oder ein anderes verschwindet, so dass sich auch der Index verändert? Also z.B. Icon das zu löschen ist hat Index 4, der nächste Befehl wäre das Icon mit Index 4 zu löschen, kurz zuvor erscheint aber ein neues Icon, so dass das zu löschende Icon einen neuen Index bekommt also z.B. 5. Dann würde man doch das falsche Icon löschen, oder? Das ist eigentlich der Grund, warum ich die "Löschfunktion" nicht mag und es besser fände ein MouseOver Befehl an das Icon zu schicken, dann würde nichts passieren wenn man das falsche Icon erwischt. Oder man müsste einen Befehl aufrufen der die Taskleiste solange blockiert bis die beiden Befehl durch sind, hat jemand vlt. eine Idee wie man das machen könnte oder wie man das Problem allgemein löst?


  • Was glaubst du, was mein Script macht...

    Wie gesagt ich kenne mich mit der Win API leider nicht so aus und msdn Seite von Microsoft ist auch ziemlich dürftig. Ich würde mal sagen dein Skript holt sich die Area wo die ganzen Icons drinnen sind, obwohl ich nicht weiß ob es nur den sichtbaren Teil holt und schickt dann den Mouse Move Befehl. Was bedeutet der 4. Parameter mit den Hexadezimalwerten, wie ist das genau zu verstehen? Aber du hattest ja bereists gesagt das es nicht funktioniert, man müsste den Mouse Move direkt an das Control Handle des Icons schicken können, das ist ja bekannt. Ich verstehe nur nicht wie Windows intern das Refresh macht, die müssen das doch abgesichert haben das da kein Befehl zwischen MouseOver und DeleteIcon kommt.

  • Wenn eine WM_MOUSEOVER Nachricht an das Fenster mit den icons gesendet wird, müsste es eigentlich aktualisiert werden. Mein Script täuscht nur eine "Mausbewegung" über alle Koordinaten in einem Rechteck von 40x16 Pixeln Größe vor, das war aber nur zu Testzwecken eingestellt. Der lParam Parameter enthält die X und Y Koordinaten in einem 8-stelligem Hexadezimalcode (Die ersten 4 für die X, und der Rest für die Y Koordinaten). Der wParam Parameter dürfte keinen Unterschied machen... Ich probiere es teotzdem noch mal.

  • So... Ich habe das ganze ein wenig überarbeitet. Das hier funktioniert bei mir:

    Spoiler anzeigen
    [autoit]

    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("TrayIconHide", 1)

    [/autoit] [autoit][/autoit] [autoit]

    _SendMessage(ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "[CLASS:ToolbarWindow32;INSTANCE:1]"), 0x0200, 0, 0)

    [/autoit]


    Ich habe die WM_MOUSEMOVE Message einfach nur an das Control geschickt, dann ging es... Das ganze funktioniert aber nicht bei allen Icons. Du müsstest alle existierenden Instances des ToolbarWindow32 Controls durchgehen um z.B. auch "Systemicons" wie das Lautsprecher Symbol zu aktualisieren.

  • Mir geht es eigentlich nur um die AutoIT Icons :). Bei mir funktioniert das leider nicht, das Handle des Icons habe ich ja bereits ausgelesen, aber so wie ich das ganze verstehe müss man doch den MouseMove Befehl direkt an das Icon schicken, oder? Also das Control ist doch auch nur ein Container für die Icons in deinem Beispiel. oder? Oder anders: wenn ich ein AutoIT Programm starte und dann über den Task Manager den Prozess beende bleibt das AutoIT Icon in der Taskleiste da, welchen Befehl müsste ich eingeben um das wegzubekommen? Wenn ich mit dem AutoIt Window Info Tool über die IconBar gehe, zeigt er mir als Klasse immer nur CLASS:ToolbarWindow32;INSTANCE:1 an, die INSTANCE 2 beinhaltet bei mir nur den Lautsprecher aber der ist ja eigentlich egal.

  • Habe ich schon versucht, funktioniert bei mir leider nicht, welches Betriebssystem verwendest du? Was ich nur nicht verstehe ist folgendes: Wenn das Control sagen wir 5 Icons hat, warum funktioniert der Befehl dann, weil eigentlich schickt man doch einen MouseMove Befehl an die Position x=0 y=0 im Control und da muss nicht mal ein Icon sein, oder schickt der Befehl einen Mouse Move Befehl an alle Positionen im Control wenn man x=0 und y=0 (also 0 als lParam) eingibt?