WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   Mouse pointer problem (https://forum.worldviz.com/showthread.php?t=3466)

Albert Russel 02-15-2011 12:58 AM

Mouse pointer problem
 
Hi,

In one of my programs I want a DropList to appear during a run and choose an item and then hide the list and the mouse pointer again. It all works fine except that the mouse will not go away until I move it after I disabled it. I tried viz.sendEvent(viz.MOUSE_MOVE_EVENT) to simulate a mouse movement but the pointer only disappears after a real mouse movement. Is it possible to hide the mouse without physically moving it?

Thanks in advance, Albert


Code:

import viz
import vizshape

viz.go()

vizshape.addGrid()
viz.clearcolor(viz.GRAY)

def enableMouse():
      viz.mouse(viz.ON)
      viz.cursor(viz.ON)
      viz.mouse.setVisible(viz.ON)

def disableMouse():
      viz.mouse(viz.OFF)
      viz.cursor(viz.OFF)
      viz.mouse.setVisible(viz.OFF)


drop = viz.addDropList()
drop.setPosition(0.5, 0.5)
drop.addItems(["a", "b", "c"])
drop.visible(viz.OFF)

disableMouse()

def handleKey(key):
        global drop
       
        if key == 'x':
                drop.visible(viz.ON)
                enableMouse()
        elif key == 'y':
                drop.visible(viz.OFF)
                disableMouse()
                viz.sendEvent(viz.MOUSE_MOVE_EVENT) # does not work, I must move the real mouse to make the pointer go away

               
viz.callback(viz.KEYBOARD_EVENT, handleKey)


hosier 02-18-2011 11:22 PM

I ran into a similar issue a few years ago. What I came up with is show below. I found this function that acts as if the mouse has been moved and the left button clicked.


Code:

from ctypes import *
import time, win32con, win32gui


PUL = POINTER(c_ulong)

class KeyBdInput(Structure):
    _fields_ = [("wVk", c_ushort),
    ("wScan", c_ushort),
    ("dwFlags", c_ulong),
    ("time", c_ulong),
    ("dwExtraInfo", PUL)]

class HardwareInput(Structure):
    _fields_ = [("uMsg", c_ulong),
    ("wParamL", c_short),
    ("wParamH", c_ushort)]

class MouseInput(Structure):
    _fields_ = [("dx", c_long),
    ("dy", c_long),
    ("mouseData", c_ulong),
    ("dwFlags", c_ulong),
    ("time",c_ulong),
    ("dwExtraInfo", PUL)]

class Input_I(Union):
    _fields_ = [("ki", KeyBdInput),
    ("mi", MouseInput),
    ("hi", HardwareInput)]

class Input(Structure):
    _fields_ = [("type", c_ulong),
    ("ii", Input_I)]

class POINT(Structure):
    _fields_ = [("x", c_ulong),
    ("y", c_ulong)]

def click(x,y):
    orig = POINT()
    windll.user32.GetCursorPos(byref(orig))
    windll.user32.SetCursorPos(x,y)
    FInputs = Input * 2
    extra = c_ulong(0)
    ii_ = Input_I()
    ii_.mi = MouseInput( 0, 0, 0, 2, 0, pointer(extra) )
    ii2_ = Input_I()
    ii2_.mi = MouseInput( 0, 0, 0, 4, 0, pointer(extra) )
    x = FInputs( ( 0, ii_ ), ( 0, ii2_ ) )
    windll.user32.SendInput(2, pointer(x), sizeof(x[0]))
    return orig.x, orig.y

You can then call the function like:

click(1,1)

and it's like you clicked it at the location x=1,y=1.

For me, the mouse click was actually more important than moving the mouse, so I ended up modifying the the code so that instead of moving the mouse to the passed x and y, I just kept it at the same point and performed the mouse click.

Aaron

Albert Russel 02-21-2011 01:10 AM

Thanks Aaron, windll.user32.SetCursorPos(x,y) solved my problem.


All times are GMT -7. The time now is 08:25 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC