Button Aktion abfangen oder mit lesen.

  • Hallo zusammen,

    ich stehe erneut vor einer Herausforderung und konnte mir leider durch Google nicht weiterhelfen. Wie in der Überschrift bereits zu lesen, suche ich nach einer Möglichkeit einen Button Event Abzufangen oder mit zu Lesen.

    Bei den meisten werden vermutlich nun alle Alarm Glocken klingeln, da es sich nach einem Cheat etc. anhört, dies ist aber so nicht. Hierbei handelt es sich nur um eine Schutzfunktion, die ich für eine Anwendung in meinem Unternehmen entwickle. Diese Anwendung hilft den Agents, die in der Chat Bearbeitung tätig sind die Chats effizienter zu handeln. Um sicherzustellen, dass es sich hierbei wirklich um kein Cheat handelt erkläre ich kurz was mein Tool so macht.

    Wir haben eine Hauptanwendung, wo 1-5 Chats Parallel in Tabs dargestellt werden. Leider entspricht diese Anwendung nicht wirklich den Anforderungen bzw. den Wünsche der Mitarbeiter. Z.B.
    - Kd. werden nicht automatisch im CRM System geöffnet.
    - Es wird nicht angezeigt, ob Kd. bereits geschrieben hat.
    - Es wird nicht angezeigt, ob Kd. sich erfolgreich legitimiert hat.
    - Kein automatisch Begrüßung.
    - Chats werden nicht automatisch gespeichert.
    - usw,
    daher muss der Agent die ganzen Sachen manuell tätigen, was enorm viel Zeit und demnach Geld kostet...

    Mein Tool erledigt, dass alles für den Agent. Beim Eingang eines Chats, zieht sich mein Tool alle notwendigen Daten des Chats und zeigt alle notwendigen Daten des Kunden in einer Oberfläche an und öffnet den Kd. im CRM System. Nun stehe ich jedoch vor folgenden Problem:

    Aktuell muss man über mein Tool den Chat schließen, damit bestimmte Automatisierung im CRM System erfolgen, weitere Aufgaben erledigt werden und der Chat im eigentlich Chat-Programm geschlossen wird. Leider kommt es oft dazu, dass die Agents aus Macht der Gewohnheit den Chat im eigentlich Chat Porgramm schließen und der Chat in meinem Tool drin bleibt und somit bestimme Sachen nicht mehr automatisiert erfolgen können und z.B. Protokoll nicht mehr erstellt werden kann.

    Als erste Lösung habe ich die Buttons beim Start meines Tools einfach ausgeblendet und beim Controllclick wieder eingeblendet. Funktioniert, finde aber das dies nicht die schönste Variante ist.
    Als zweiter Methode, habe ich einfach über die Buttons unsichtbare Labels gelegt. Funktioniert, jedoch sieht man bei den Buttons keinerlei Hover oder klick auf den Button.
    Dritte Methode habe ich die MouseOver UDF probiert.... naja das hat mein Tool massiv ausgebremst.


    Ich denke das muss doch irgendwie umzusetzen sein, dass ich den Klick auf den Button abfange und zu erst meine Ausführungen durchführe...

    Ich bin für jede Idee dankbar.

    BugFix ich wäre dir Dankbar, wenn du bestätigen könntest, dass ich hier wirklich an keinem Cheat oder ähnlichem arbeite :D

  • Könnte es sein dass dir die AnyGui UDF weiterhilft?
    Damit kannst du z.B. einen Button in einer fremdgui einfügen.
    Du könntest also auch den eigentlichen Button ausblenden und deinen eigenen an der Stelle einfügen.
    Dann kannst du bei einem Klick die gewünschten Aktionen ausführen und am Schluss einen Controlclick auf den verstecken Originalbutton machen
    Die UDF ist recht alt. Du müsstest erstmal testen ob sie noch funktioniert. Vor ca zwei Jahren tat sies zumindest noch :rolleyes:
    http://www.autoitscript.com/forum/topic/9517-anyguiau3/

    Edit:
    Am besten gleich die aktuellste version auf der letzten Seite Probieren ;)

  • Ein Button in eine Fremd gui Einzufügen ist ja nicht so schwer, da brauch ich keine extra Udf dafür. Diese Lösung ist so ähnlich wie meine mit dem Lebes drüberlegen...

    Warum mir das nicht sogefällt, ist dass ich bei klick auf mein eingefügtes, mein Button deaktivieren bzw ausblenden muss das original Button ein blenden und draufdrücken... Und anschließend alles wieder zurücksetzen...

    Ich glaube cheesetiger hat mir im Chat gesagt, dass dllinject oder so ähnlich dafür am besten geeignet ist... Aber ich finde de irgendwie dazu nix?

  • Ein Button in eine Fremd gui Einzufügen ist ja nicht so schwer, da brauch ich keine extra Udf dafür. Diese Lösung ist so ähnlich wie meine mit dem Lebes drüberlegen...


    Ja sicher gibt auch andere Möglichkeiten. Damit hättest du halt wirklich einen Button, der auch so reagiert. (Hover und Animation bei klick usw)
    Das hast du ja mit dem Label darüber nicht.

    Und den ausgeblendeten Button kann man im Normalfall trotzdem mit Controlclick betätigen.

    Zu dllinject's wirst du wenig finden und hier keine Hilfe bekommen weil das fast ausschließlich benutzt wird um Viren uÄ zu programmieren.

  • Ok ich habe leider keine Lösung für mich gefunden, daher habe ich mir selbst überlegt, wie ich das den selber bauen kann.
    Ich bin nun wie folgt vorgegangen:

    - Als erstes versuche ich das Handle unter der Maus zu ermitteln.
    - Danach muss ich irgendwie ermitteln ob die Linke Maustaste gedrückt wurde. Dies stelle ich mit _ispressed() an.
    - Das ganze habe ich nun zusammen addiert und meine Funktion ist fertig.

    Ich hoffe das ich hier mit meiner Funktionen gegen keine Forum Regeln verstoße.... Ansonsten bitte diesen Post löschen.

    Spoiler anzeigen
    [autoit]


    #include <WinAPI.au3>
    #include <Misc.au3>

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

    ; #FUNCTION# =======================================================================================
    ; Name ..........: _capture_click_on_hWnd
    ; Description ...: - Ermittelt ein Maus oder Tastenklick auf einem bestimmtes Handle.
    ;
    ; Parameters ....: $hWnd - der zu ermittelnde handle
    ; ...............: $sHexKey Default(01 "Links Klick") - Key welcher ermittlet werden soll.
    ;
    ; Return values .: (1) - wird zurückgegeben, wenn der klick auf das handle erfolgte.
    ; @error.........: (1) - das Übergebene Handle ist kein Handle.
    ;
    ; Includes.......: <WinAPI.au3> & <Misc.au3>
    ;
    ; Author ........: 4ern.de alias rYnow
    ; ==================================================================================================
    func _capture_click_on_hWnd($hWnd,$sHexKey = '01')
    if _IsPressed($sHexKey) then
    Local $stInt64,$aRet,$stPoint=DllStructCreate("long;long")
    DllStructSetData($stPoint,1,MouseGetPos(0))
    DllStructSetData($stPoint,2,MouseGetPos(1))
    $stInt64=DllStructCreate("int64",DllStructGetPtr($stPoint))
    $aRet=DllCall("user32.dll","hwnd","WindowFromPoint","int64",DllStructGetData($stInt64,1))
    if $aRet[0] = $hWnd then
    return 1
    endif
    endif
    endfunc ;<==/capture_click_on_hWnd

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

    ;----------------------------------------------------------------------------------------------/
    ; Beispiel "=" Taste auf dem Windows Taschenrechner
    ;----------------------------------------------------------------------------------------------/
    $hWnd = ControlGetHandle('Rechner', '', '[CLASS:Button; INSTANCE:21]')
    While 1
    if _capture_click_on_hWnd($hWnd) = 1 then
    ConsoleWrite('"'&ControlGetText('', '', $hWnd) &'" wurde geklickt' &@lf )
    Endif
    if _IsPressed('1B') then exit
    Sleep(10)
    WEnd

    [/autoit]
  • Hallo

    Du brauchst dafür einen sogenannten "Hook". Damit kannst du Aktionen abfangen, bevor sie Windows ausführt, anders kommst du da nicht weiter.:
    http://msdn.microsoft.com/en-us/library/…9(v=vs.85).aspx

    Du kannst damit dann die "Cancel Notification" abfangen und deinem Programm sagen, was es machen soll, bevor der Cancel in dem eigentlichen Programm ausgeführt wird.

    Ich habe jetzt für AutoIT keine Beispiele parat, ich habe soetwas ähnliches damals mal mit Visual Basic 6.0 gebastelt (Alt + F4 systemweit abfangen und abblocken und darauffolgend eine andere Aktion ausführen).

    Aber vielleicht kannst du hier ein paar Infos entnehmen:
    http://www.autoitscript.com/forum/topic/12…twindowshookex/
    https://www.autoitscript.com/autoit3/docs/l…ndowsHookEx.htm


    Dein Workarround bringt ja in dem Fall eigentlich garnichts du hast folgendes geschrieben:

    Zitat

    Ich denke das muss doch irgendwie umzusetzen sein, dass ich den Klick auf den Button abfange und zu erst meine Ausführungen durchführe...

    Eine Funktion einer fremden Anwendungen abzufangen, bevor sie ausgeführt wird, geht nur mit einem "Hook". Mit deinem Workarround geht das leider nicht.

    Edit:
    Hier habe ich nochmal durch Suchen ein Script gefunden, welches fremde Fensteraktivitäten erkennt:
    http://www.autoitscript.com/forum/topic/81…rk/#entry584458

    Wenn du daraus die notwendigen Informationen entnimmst, solltest du eigentlich weiterkommen.

    8 Mal editiert, zuletzt von KloMeister (29. September 2014 um 16:11)

  • Also wenn ich jetzt dein Beispiel benutze (Habe Windows 7), dann wird der Klick bei dem Rechner trotzdem durchgeführt.
    Bei mir ist es komischerweise auch die * Taste die die "Instance 21" hat und nicht die = Taste (Aber das ist ja nebensächlich).

    Ich hatte das so verstanden, dass du einen Klick in einer fremden Anwendung abfangen willst und stattdessen deine Funktion aus dem eigenen Programm ausführen wolltest. Währenddessen ist die Funktion aus dem fremden Programm geblockt und deine Funktion wird bevorzugt dazwischen geschoben, erst dann wird der Cancel im eigentlichen Programm fortgeführt.


    Wenn es wirklich nur darum ging eine Aktion auszuführen nachdem der Chat geschlossen wurde, wären da noch wesentlich einfachere Möglichkeiten gewesen:

    Überwachung von Fenstern... Einfach in einer Schleife bzw. mit einem Timer abfragen ob eine Anwendung als Prozess oder als Fenstername noch existiert und falls nein, dann deinen Code ausführen.

    Das hätte ich dann Vorgeschlagen

    [autoit]

    ShellExecute("Calc")
    WinWait("[CLASS:CalcFrame]", "", 10)

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

    ;Die Eigentliche Funktion, wenn Schleife nicht möglich eventuell Timer nutzen
    Do
    local $hCalc = WinGetHandle("[CLASS:CalcFrame]")
    until $hCalc ="0x00000000"
    msgbox(0,"","Rechner wurde geschlossen")

    [/autoit]


    Wenn bei dir alles funktioniert, dann ist die Sache ja gegessen.

    Einmal editiert, zuletzt von KloMeister (30. September 2014 um 11:12)