Programm zur Koordinateneingabe

  • Hallo Panik,


    Du hast aber schon ein WINCE-Programm für den ARM-Prozessor erzeugt und nicht vielleicht eine Windows-exe (Intel/AMD) erstellt?!?


    Neues Projekt -> leere Projekte -> WinCE Pocket PC Anwendung (EXE)


    Dann müssten die Projekteigenschaften richtig eingestellt sein.



    Gruß,
    Stefan

    2 Mal editiert, zuletzt von StefanDausR ()

  • Hallo Stefan,


    ich habe das Koordmenu auch verwendet um Skripte zu starten. Dabei habe ich auch den Doppelklick nutzen wollen. Eigentlich funktioniert es auch, aber es ergbit sich für mich eine Art Performance-Problem.


    Laut Doku werden ja beim Doppelklick die events Klick - Loslassen - Doppelklick und Loslassen ausgelöst.


    Wenn ich nun auf ein einfaches Klick SkriptA und bei Doppelklick SkriptB starten will, dann geht dies nicht, zumindest nicht einfach, weil ja immer SkriptA gestartet wird und beim Doppelklick zusätzlich SkriptB.


    Als Ausweg muss SkriptA immer einige Zeit warten und checken, ob inzwischen SkriptB auch aktiv ist (und sich dann ggf. selbst beenden). Falls SkriptB nicht kommt, also beim einfachen Klick, muss man immer eine bestimmte Zeit warten bis man absolut sicher ist, dass nichts mehr nachkommt.


    Egal, wie man dem SkriptA das Koord-Event Doppelklick bekannt macht (via Existenz eines weiteren Skripts oder via Datei-Existenz/-eintrag oder Registry-Eintrag) man muss immer solange warten bis man absolut sicher ist, dass das System (auch unter paralleler Last) dies sicher geschafft hat.


    Dadurch ergeben sich m.E. unnütze Wartezeiten. Kann man das Verhalten nicht ändern, so das Koord beim Doppelklick auch nur das Event Doppelklick auslöst (und ggf. Loslassen, aber kein einfaches Klick)?


    Oder gibt es eine andere Lösung für mein Problem.


    Gruß Wisch07.

  • Hallo,


    also erst mal freut es mich, dass Du das Koord-Menü einsetzt!
    Dein Problem kann ich nachvollziehen, aber lt. Microsoft sind Klick und Doppelklick so "definiert":

    Code
    "Klick" ==> "WM_LBUTTONDOWN -> WM_LBUTTONUP",
    "Doppelklick" ==> "WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLICK -> WM_LBUTTONUP"


    Daran habe ich nichts geändert und reiche die Messages nur weiter.


    Wenn man einen Doppelklick nutzt, dann verwendet man normalerweise dWM_LBUTTONDOWN und WM_LBUTTONUP um die Buttons zu animieren (gedrückt, losgelassen)
    Klick und Doppelklick eignen sich nicht so besonders für Doppelbelegung.
    Hast Du es schon mal mit einen "langen Klick" versucht?


    Wenn ich das Verhalten ändere, dann kann die Auslösung des events nur zeitverzögert geschehen, da ich ja nicht voraus ahnen kann, was der Benutzer machen wird.


    Hast Du eine bessere Lösung?


    Gruß,
    Stefan

  • Nur mal ins Unreine gedacht, Stefan, wäre es nicht möglich, über SetDoubleClickTime(200) den Defaultwert von 500ms zu reduzieren und bspw. in der Methode PreTranslateMessage(...) diese Zeit erstmal abzuwarten?
    Ich denke eine generelle Verzögerung um 200 ms wäre gradeso akzeptabel.


    Oder habe ich jetzt was übersehen?

  • Hallo Stefan,


    ehrlich gesagt, habe ich absolut keine Ahnung, wie die Dialogprogrammierung unter Windows (oder unter irgendeinem anderen BS) im Detail aussieht.


    Ich kann mir allerdings nicht vorstellen, das jeder Programmierer, der Dialogprogrammierung macht und auf Klick bzw. Doppelklick reagieren will, alle BS-Events 1:1 weitergereicht bekommt und danach dieses Timing selbst programmiert. Ich nehme mal an, dass diese Arbeit von den diversen Frameworks und Libraries übernommen wird.


    Irgendein Programm muss warten, um zu entscheiden, ob der Benutzer Klick oder Doppelklick wollte, das ist klar. Ich würde es wesentlich einfacher finden, wenn dies Koord übernehmen würde, weil die von Koord gestarteten Programme oder Skripte es viel schwerer haben. Sie müssen einfach mit mehr Sicherheitspuffer rechnen, weil letztlich ein neuer Prozess gestartet werden muss, der dann durch seine Existenz oder durch einen Registry oder File-Eintrag den Doppelklick signalisiert. Ausserdem muss jedes Skript/Programm die Logik selbst implementieren.


    Koord könnte auch wissen, ob beim betreffenden Button überhaupt auf Doppelklick reagiert wird. Wenn es nur ein Einfach-Klick Button ist, dann bräuchte gar nicht gewartet zu werden. Dadurch gibt es auch keinen allg. Nachteil für Anwender, die davon nicht Gebrauch machen.


    OK, wünschen kann ich mir viel, aber Arbeit hättest du damit :)


    Wie gesagt, funktioniert meine aktuelle Lösung prinzipiell, allerdings etwas zäh, weil man meine Sicherheits-Verzögerung doch merkt.


    Den langen Klick habe ich noch nicht versucht. Da man lt. Doku allerdings 2 bis 3 Sekunden gedrückt halten muss, ist das auch nicht gerade für flüssiges, schnelles Arbeiten geeignet.


    Gruß, Wisch07.

  • Hallo Stefan,


    ja, ja, habe das schon alles so gemacht und nochmal kontrolliert.
    Aber erst mit der Version 4.50 (nicht 6.00) klappt es ?(


    Danke dir


    Panik

    Einmal editiert, zuletzt von Panik ()

  • Hallo Ralf,

    Zitat

    Original von Ralf25
    Nur mal ins Unreine gedacht, Stefan, wäre es nicht möglich, über SetDoubleClickTime(200) den Defaultwert von 500ms zu reduzieren und bspw. in der Methode PreTranslateMessage(...) diese Zeit erstmal abzuwarten


    es ist schon klar, dass man das machen kann.


    Wenn ich das ändere, dann werde ich einen neuen Typ (z.B. \button) einführen, denn es gibt sicher auch Anwendungen, die die derzeitige Funktionalität benötigen.


    Gruß,
    Stefan

  • Zitat

    Original von StefanDausR


    Wenn ich das Verhalten ändere, dann kann die Auslösung des events nur zeitverzögert geschehen, da ich ja nicht voraus ahnen kann, was der Benutzer machen wird.


    Hallo Stefan,


    ja, so habe ich es auch mit MS gelöst. 1 sec. Watezeit reicht für einen Double- und 1,5 für einen Triple- und Quad-Klick. Funktioniert sogar mit Mopedhandschuhen und die Wartezeit empfinde ich gar nicht.


    Mit Koord werde ich Deinen Doppel-Klick in meinem Menu auch mal testen.
    Kannst Du übrigens bitte noch mal hier vorbeischauen, habe noch eine Frage.


    Gruß
    Stephan


    Edit 15.10.09: Und hier:


    Edit 27.10.09: Bin mit meinem KoordMenu hierhin umgezogen.


    Edit 29.10.09: Und hier:

    6 Mal editiert, zuletzt von ssnweb ()

  • Hallo Stefan,


    gibt es von der Reaktion her einen Unterschied zwischen diesen Zeilen:


    a) params: "RORegKeys=768 window=0 RORegKeys=0 Sleep0= 1100 SendKey=\s1000\119\c100,10,230\c100,330,230| RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO";


    b) params: "RORegKeys=768 window=0 RORegKeys=0 Sleep0= 2000 SendKey=\s100119\c100,10,230\c100,330,230| RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO";


    c) params: "RORegKeys=768 window=0 RORegKeys=0 Sleep0= 100 SendKey=\s2000\119\c100,10,230\c100,330,230| RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO";


    Gruß sokobana

  • Hallo sokobana,

    gibt es von der Reaktion her einen Unterschied zwischen diesen Zeilen

    erst einmal folgendes:
    - Man kann jeden Parameter nur einmal pro Koord-Aufruf angeben (bei Mehrfachangabe wird der erste genommen)
    - Die Reihenfolge, in denen die einzelnen Parameter abgearbeitet werden, ist im Programm festgelegt (und hier dokumentiert)
    - anders ist es bei der Abarbeitung innerhalb eines Parameters: So darf z.B. SendKey= nur einmal vorkommen, aber die Anweisungen innerhalb können mehrfach vorkommen und werden in der angegebenen Reihenfolge verarbeitet.


    Zu Deinen Beispielen hier die zeitliche Abfolge in Koord:


    a)
    sleep0=1100
    RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO
    RORegKeys=768
    SendKey=\s1000\119\c100,10,230\c100,330,230|

    also folgender Ablauf: Koord wird gestartet -> 1100ms Warten -> RegKey schreiben -> ROregKeys setzten und kopieren -> 1000ms Warten -> Klickfolge


    b)
    sleep0=2000
    RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO
    RORegKeys=768
    SendKey=\s100\119\c100,10,230\c100,330,230|


    also folgender Ablauf: Koord wird gestartet -> 2000ms Warten ->
    RegKey schreiben -> ROregKeys setzten und kopieren -> 100ms
    Warten -> Klickfolge


    c)
    sleep0=100
    RegKeyMode=1 RegKey=Software\sokobana,TMCTEMPAUTO
    RORegKeys=768
    SendKey=\s2000\119\c100,10,230\c100,330,230|



    also folgender Ablauf: Koord wird gestartet -> 100ms Warten ->
    RegKey schreiben -> ROregKeys setzten und kopieren -> 2000ms
    Warten -> Klickfolge



    Also das Timing ist durchaus unterschiedlich!


    Gruß,
    Stefan

  • Hallo Stefan,
    vielen Dank für Deinen ausführlichen Kommentar! :tup
    Gut, dass ich nachgefragt habe ...


    Deine ausführliche Tabelle hatte ich bisher anders interpretiert:
    Ich dachte immer, die Parameter müssen in der vorgegebenen Reihenfolge in der Befehlszeile stehen.
    Dass damit aber nur(?) die Ausführungsreihenfolge gemeint ist, hatte ich nicht kapiert.


    Gruß sokobana

  • - Man kann jeden Parameter nur einmal pro Koord-Aufruf angeben (bei Mehrfachangabe wird der erste genommen)
    - Die Reihenfolge, in denen die einzelnen Parameter abgearbeitet werden, ist im Programm festgelegt (und hier dokumentiert)
    - anders ist es bei der Abarbeitung innerhalb eines Parameters: So darf z.B. SendKey= nur einmal vorkommen, aber die Anweisungen innerhalb können mehrfach vorkommen und werden in der angegebenen Reihenfolge verarbeitet.


    Gruß,
    Stefan


    Hallo Stefan,


    wie kann man denn 2 exe-Dateien mit einem SendKey ausführen lassen?


    Window=0 SendKey=\l\My Flah Disk\xyz.exe|\l\My Flah Disk\abc.exe| ?(


    Gruß
    Stephan



    Edit 15.12.2009: bis jetzt habe ich das nur über Tricks hinbekommen

    Einmal editiert, zuletzt von ssnweb ()

  • Hallo Stephan,

    wie kann man denn 2 exe-Dateien mit einem SendKey ausführen lassen?


    Window=0 SendKey=\l\My Flash Disk\xyz.exe|\l\My Flash Disk\abc.exe|

    ja genau so!
    Du kannst auch Parameter mit übergeben, wenn Du sie mit einem Doppelpunkt von der exe abtrennst, also so:

    Code
    Window=0 SendKey=\l\My Flash Disk\xyz.exe:para1 para2|\l\My Flash Disk\abc.exe:x=5|


    Zu beachten ist aber Folgendes:
    Mit dieser Syntax werden die beiden Programme gleichzeitig ausgeführt, d.h. xyz.exe natürlich unwesentlich früher als abc.exe.


    Ein explizites Warten auf das Beenden von Programm xyz.exe ist noch nicht implementiert.


    Zitat

    bis jetzt habe ich das nur über Tricks hinbekommen

    was geht denn nicht?



    Gruß,
    Stefan


  • Soweit alles, aber eben nur über Umwege.
    Ich werde Dir heute Abend mal meine Steuerung.txt zukommen lassen.



    Gruß
    Stephan


    P.S. Mit dem KoordMenu kann man jetzt die Seiten-Border/Button automatisch nach einem Intervall ausblenden lassen: hier:

  • Hallo Stephan,


    vielleicht liegt es an den Programmen selbst, dass das nicht richtig funktioniert. Welche Programme startest Du denn?


    Ich hatte das mal so bei mir im Einsatz:
    window=0 SendKey=\l\Storage Card\GP4.52\My Flash Disk\navigation\audiomanager.exe|\l\Storage Card\GP4.52\My Flash Disk\navigation\SSP.EXE|\l\Storage Card\GP4.52\My Flash Disk\navigation\MNAVDCE.EXE|\f20000|Gopal Navigator\c0,425,230
    Das hat funktioniert, wobei audiomanager.exe und ssp.exe Programme ohne eigenes Fenster sind.


    Einen Sleep (\s1000) kannst Du natürlich dazwischen einfügen!


    Das mit den Parametern war nur ein fiktives Beispiel:

    Code
    window=0 SendKey=\l\Storage Card\Programme\TourGen.exe:koord465=1|


    ruft Tourgen mit dem Parameter koord465=1 auf


    Gruß,
    Stefan


    Edit: ein CODE-Tag entfernt, damit sich die Werbung nicht verschiebt...

    Einmal editiert, zuletzt von StefanDausR ()