Jump to content

Intercept Message in Another App


Recommended Posts

Hi

I am new to the forum but have used AutoIt many years ago. Now I returned to it and got stuck with a problem that I thought would be simple: I want to react to WM_GESTURE messages (pinch/zoom on touch screen) in another program.

Background: I have a windows tablet that I no longer use and a USB-oscilloscope (OWON VDS1022) that I rarely use because it is so much hassle to set it up. Now I want to combine both into a compact tablet-oscilloscope. But the app for the oscilloscope was not written with touch in mind. So I need to add some simple features, one of which is the pinch/zoom gesture.

I can control the app from AutoIt via hotkeys that change the time base of the waveform, which is basically a zooming function. All I need to know is when somebody performs a pinch/zoom gesture over the applications window. Is there a way to intercept the WM_GESTURE message in this app from AutoIt?
I found a nice example for pinch/zoom in your own GUI (see below). Is there a way to adapt this?

Thanks a lot!

 

; Original code by LawrenceDon & GtaSpider

#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>
#RequireAdmin

Global $iMemo, $hLab
;Global Const $WM_GESTURE = 0x119
Global Const $GID_BEGIN = 0x01
Global Const $GID_END = 0x02
Global Const $GID_ZOOM = 0x03

Local $hGUI

Global $old_ullArg = 0
Global $iFontSize = 9

Global Const $tagPOINTS = "struct;short X;short Y;endstruct"
Global Const $tagGESTUREINFO = "UINT cbSize; DWORD dwFlags; DWORD dwID; HWND hwndTarget;"  & $tagPOINTS &  ";DWORD dwInstanceID; DWORD dwSequenceID; UINT64 ullArgumengs; UINT cbExtraArgs"
_Main()

Func _Main()

    $hGUI = GUICreate("WM_GESTURE", 1080, 640)
    $hLab = GUICtrlCreateLabel("TEST",320,0,760,640,$SS_CENTER + $SS_CENTERIMAGE)
    GUICtrlSetFont(-1,$iFontSize)

    GUIRegisterMsg($WM_GESTURE, "WM_GESTURE")

    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd

    Exit

EndFunc   ;==>_Main

Func WM_GESTURE($hWnd, $Msg, $wParam, $lParam)

    $GesInfo = DllStructCreate($tagGESTUREINFO)
    DllStructSetData($GesInfo, "cbSize", DllStructGetSize($GesInfo))
    $pGesInfo = DllStructGetPtr($GesInfo)
    DllCall("User32.dll", "BOOL", "GetGestureInfo", "HANDLE", $lParam, "struct*", $pGesInfo)

    Local $dwID = DllStructGetData($GesInfo, "dwID")
    Local $ptsLocX = DllStructGetData($GesInfo, "X")
    Local $ptsLocY = DllStructGetData($GesInfo, "Y")
    Local $ullArg = DllStructGetData($GesInfo, "ullArgumengs")

    Switch $dwID
        Case $GID_BEGIN, $GID_END
            ;Reset old_ullArg when event begins/ends
            $old_ullArg = 0
        Case $GID_ZOOM
            ;only start the process if old_ullArg set before
            If $old_ullArg > 0 Then
                ;if old_ullArg is smaller than new ullArg then start the zoom out process (font smaller)
                If $old_ullArg > $ullArg Then
                    $iFontSize -= 2
                    If $iFontSize < 1 Then $iFontSize = 1
                    GUICtrlSetFont($hLab,$iFontSize)
                Else
                    $iFontSize += 2
                    GUICtrlSetFont($hLab,$iFontSize)
                EndIf
            EndIf
            $old_ullArg = $ullArg
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
; Original code by LawrenceDon & GtaSpider

#include <StructureConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>
#RequireAdmin

Global $iMemo, $hLab
;Global Const $WM_GESTURE = 0x119
Global Const $GID_BEGIN = 0x01
Global Const $GID_END = 0x02
Global Const $GID_ZOOM = 0x03

Local $hGUI

Global $old_ullArg = 0
Global $iFontSize = 9

Global Const $tagPOINTS = "struct;short X;short Y;endstruct"
Global Const $tagGESTUREINFO = "UINT cbSize; DWORD dwFlags; DWORD dwID; HWND hwndTarget;"  & $tagPOINTS &  ";DWORD dwInstanceID; DWORD dwSequenceID; UINT64 ullArgumengs; UINT cbExtraArgs"
_Main()

Func _Main()

    $hGUI = GUICreate("WM_GESTURE", 1080, 640)
    $hLab = GUICtrlCreateLabel("TEST",320,0,760,640,$SS_CENTER + $SS_CENTERIMAGE)
    GUICtrlSetFont(-1,$iFontSize)

    GUIRegisterMsg($WM_GESTURE, "WM_GESTURE")

    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd

    Exit

EndFunc   ;==>_Main

Func WM_GESTURE($hWnd, $Msg, $wParam, $lParam)

    $GesInfo = DllStructCreate($tagGESTUREINFO)
    DllStructSetData($GesInfo, "cbSize", DllStructGetSize($GesInfo))
    $pGesInfo = DllStructGetPtr($GesInfo)
    DllCall("User32.dll", "BOOL", "GetGestureInfo", "HANDLE", $lParam, "struct*", $pGesInfo)

    Local $dwID = DllStructGetData($GesInfo, "dwID")
    Local $ptsLocX = DllStructGetData($GesInfo, "X")
    Local $ptsLocY = DllStructGetData($GesInfo, "Y")
    Local $ullArg = DllStructGetData($GesInfo, "ullArgumengs")

    Switch $dwID
        Case $GID_BEGIN, $GID_END
            ;Reset old_ullArg when event begins/ends
            $old_ullArg = 0
        Case $GID_ZOOM
            ;only start the process if old_ullArg set before
            If $old_ullArg > 0 Then
                ;if old_ullArg is smaller than new ullArg then start the zoom out process (font smaller)
                If $old_ullArg > $ullArg Then
                    $iFontSize -= 2
                    If $iFontSize < 1 Then $iFontSize = 1
                    GUICtrlSetFont($hLab,$iFontSize)
                Else
                    $iFontSize += 2
                    GUICtrlSetFont($hLab,$iFontSize)
                EndIf
            EndIf
            $old_ullArg = $ullArg
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

 

Link to post
Share on other sites

Hmm, let me rephrase my question a little bit simpler:

AutoIt can react to mouse movements and clicks anywhere on the screen, right? I want basically the same for touch gestures. Is this possible?

I would be thankful for any hint in the right direction.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...