Showing results 1 to 6 of 6

Thread: Simulate Mouse Event

  1. #1
    Join Date
    08.05.2015
    Location
    Frankfurt
    Posts
    3

    Frage Simulate Mouse Event

    Wir benutzen Windows 7 und zenon 7.20 build 24121.

    In unserer Applikation haben wir auf Multitouchgesten zu reagieren und deswegen die Option Projekt/Interaction/Multi-Touch/Recognition auf Windows 7 gestellt um so mittels des TouchManipulationCompleteEvent Swipe Gesten zu erkennen und zu reagieren.
    Leider wird dann kein Touch-Event auf im Screen angeordnete WPF User Controls weitergeleitet.

    Die Aufgabe ist nun in der Gestenerkennung ein Touch zu erkenne (soweit kein Problem) und dann gegebenenfalls mit den aktuellen Koordinaten einen Mausklick zu simulieren.
    Wie Simuliere man im VSTA Projekt einen Mausklick auf den gerade in der zenun Runtime aufgeschalteten Screen?
    Last edited by miks : 20th April 2016 at 09:59 Reason: zenen version korrigiert

  2. #2
    Join Date
    13.08.2013
    Posts
    57

    Default Re: Simulate Mouse Event

    Hi,
    ich hätte da vielleicht eine Idee.
    Bitte kurz zur Klarstellung, wer welche Infos braucht und wo die Events stattfinden.

    Wenn Window7Touch in zenon aktiv ist, werden durch das Touchlayer keine TouchEvents mehr ans WPF durchgeleitet.Das heiße meine Interpretation ist das ihr die Events gerne ans WPF weiterleiten wollt(MouseClick). Dafür gibts für mich Möglichkeiten, mit oder ohne VSTA.
    Aber bitte nur kurz klarstellen ob meine Interpretation richtig ist, dann werd ich schaun ob ich schnell ein Sample machen kann.

    Lg Sigi

  3. #3
    Join Date
    08.05.2015
    Location
    Frankfurt
    Posts
    3

    Lächeln AW: Simulate Mouse Event

    Ja, meine Überlegung ging in die Richtung. So muss ich mich nicht um die Maussimulation in meinem User Control kümmern.

    Ich habe nun selbst einen Weg gefunden:
    Im VSTA Projekt:
    Am Anfang des Projekt Addins:

    using System.Runtime.InteropServices;

    Innerhalb von ThisProject:

    [DllImport("user32", EntryPoint = "mouse_event")]
    static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

    In der Routine die die TouchManipulationEvents auswertet, falls ein Touch und keine andere Multitouch Gesteerkannt wurde:

    mouse_event(0x00000002, 0, 0, 0, 0); //leftmousedown
    mouse_event(0x00000004, 0, 0, 0, 0); //leftmouseup

    So wird aus dem Touch ein Mausklick.
    Es hakelt aber ein wenig. Wo mit der "echten" Maus ein einfacher Klick langt ist nun ein "doppeltouch" nötig.
    Also wenn es noch eine andere Lösung gibt, würde mich auch sehr interessieren
    Last edited by miks : 21st April 2016 at 15:06 Reason: Im VSTA Projekt hinzugefügt

  4. #4
    Join Date
    13.08.2013
    Posts
    57

    Default Re: Simulate Mouse Event

    Hi,
    Sorry hab mir noch ne VM mit Windows7 machen müssen um das zu testen.
    dann Ansatz gefällt mir gut, ich sehe nur 2 Problem, die Übersetzung von Start,Delta und Complete in ein MouseClick und das die ganze Sache global ist, dh auch wenn wir nicht im WPF sind wir ein MouseClick ausgelöst, auch wieder global.
    Meine Referenzen für mein Beispiel
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx (Für die Auswertung der Touchgesten)
    Und
    http://stackoverflow.com/questions/6...essages-in-wpf (um den Touchkontext zu bekommen

    Im WPF dann das aktuelle Windowhandle bekommen und hooken

    IntPtr handle = IntPtr.Zero;
     IntPtr GetCurrentHandle()
        {
          HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
    
          IntPtr handle = IntPtr.Zero;
          if (hwndSource != null)
          {
            
            handle = hwndSource.Handle;
            current = handle;//Zwischenspeichern
            hwndSource.AddHook(WndProc);
          }
          return handle;
        }
    HookFunktion definieren
    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
          if (hwnd == current)//wir haben uns unser handle gemerkt und reagieren nur darauf
          {
            
            MessageBox.Show("Worked");  //hier schlägt der Messageboxteufel zu aber als POC ganz gut
            // Handle messages...
          }
    
          return IntPtr.Zero;
        }
    And geeigneter Stelle initieren (z.B. Load in meinem Sample ist es ButtonClick)

     public void InitEvents ()
        {
          try
          {
            IntPtr Parent = GetParent(GetCurrentHandle());
           // RegisterTouchWindow(Parent,0);
    
          }
          catch(Exception ex)
          {
            Debug.Print(ex.Message);
          }
    
        }
    Die Events können wir jetzt wie in https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx auswerten(muss adaptiert werden statt ref m direkt die Properties verwenden) und dann ggf. MouseClicks triggern(TODO).

    Im Anhang das VS-Projekt(VS2015)
    Attached Files Attached Files

  5. #5
    Join Date
    08.05.2015
    Location
    Frankfurt
    Posts
    3

    Frage AW: Simulate Mouse Event

    Ich verstehe nicht ganz was dort passieren soll.

    Die geeignete Stelle für den Init wäre dann der Constructor?

    Die Events können wir jetzt wie in https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx auswerten(muss adaptiert werden statt ref m direkt die Properties verwenden) und dann ggf. MouseClicks triggern (TODO).
    Also die private IntPtr WndPro aus ihrem Code wird dann ausgeführt wenn bei einem Touch das UserControl unter den Fingern liegt?
    Dann mit der mouse_event Funktion den Klick simulieren?
    Last edited by miks : 22nd April 2016 at 12:31 Reason: Init

  6. #6
    Join Date
    13.08.2013
    Posts
    57

    Default Re: Simulate Mouse Event

    Naja, damit bekommst du Messages vom System, in dem Fall sogar MouseDown/UP (nur wenn auf einem Element z.b. Button oder Liste)im Falle eines TouchDowns/Up. Somit lassen sich die MouseEvents wieder simulieren um z.B. einen Click zu bekommen. Ich habe das Beispiel entsprechen erweitert. Selektion in einer List funktionert hier auch. Eine Liste der möglichen Nachrichten findest du hier https://autohotkey.com/docs/misc/SendMessageList.htm

          if (hwnd == current)
          {
            if (msg == WM_LBUTTONDOWN && !ignoreNextDown)   //Damit wir den "simulierten" MouseDown nicht auswerten ignorieren wir den nächsten
            {
              mouse_event(0x00000002, 0, 0, 0, 0);
              ignoreNextDown = true;
            }
            else if(msg==WM_LBUTTONDOWN && ignoreNextDown)   //Würden wir den von uns getriggerten MouseDown nicht ignorieren würden wir in einer endlosschleife stecken
            {
              ignoreNextDown = false;
            }
            if (msg == WM_LBUTTONUP && !ignoreNextUp)//Damit wir den "simulierten" MouseUP nicht auswerten ignorieren wir den nächsten
            {
              mouse_event(0x00000004, 0, 0, 0, 0);
              ignoreNextUp = true;
            }
            else if (msg == WM_LBUTTONUP && ignoreNextUp)
            {
              ignoreNextUp = false;
            }
          }
    
          return IntPtr.Zero;

    Lg Sigi
    Attached Files Attached Files

Similar Threads

  1. Mouse event for a button
    By yolovs in forum VBA
    Replies: 8
    Last Post: 26th June 2013, 12:33
  2. mouse event
    By armins in forum VSTA
    Replies: 5
    Last Post: 11th June 2013, 08:02
  3. Mouse over
    By croc in forum VBA
    Replies: 6
    Last Post: 23rd December 2011, 13:25
  4. Simulate variable values
    By bojan in forum zenon Supervisor
    Replies: 3
    Last Post: 29th March 2011, 23:51
  5. how to simulate PLC data?
    By gralex in forum Drivers
    Replies: 6
    Last Post: 18th March 2009, 09:50

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •