WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

 
 
Thread Tools Rate Thread Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 06-27-2012, 11:54 AM
Adam.Grey Adam.Grey is offline
Member
 
Join Date: Jan 2012
Posts: 9
does vizard handle input differently when it's embedded?

Is there something special I have to do for vizard embedded to get mouse and keyboard?

I need to embed my vizard window in a WPF control. I adapted this tutorial and this one(thanks farshizzo) to suit and made a nice control that starts up a vizard script and passes the handle to the window I've created as the first paramater. The script, if it sees the first parameter, takes that to be a window handle and embeds itself in that window. It almost entirely works.
However, I can't seem to get input to go through. Microsoft's tutorial works just fine with their own listbox, but I'm not sure if vizard's input is handled differently.
I know the script itself is properly receiving input. If I run this script with the only difference being that it isn't embedded, it responds properly to mouse and keyboard input.
I know vizard isn't hanging or blocked out of input: The ball spins, and if I check the keyboard state manually (e.g., viz.key.isDown(' ', True)), I can see if keys are up or down. onkeydown doesn't seem to work, however.
p/invoking win32's setfocus does not appear to do anything.

here's the vizard script:
Code:
import viz
import vizact


viz.add('tut_ground.wrl')
ball = viz.add('ball.wrl',pos=(0,1.8,2))
ball.add(vizact.spin(0,1,0,90))

def mytimer(num):
	if num is 0:
		ball.setPosition(0, 1.8, 4)
	elif num is 1:
		if viz.key.isDown(' ', True):
			ball.setPosition(0, 1.8, 3)

vizact.ontimer(0.1666, mytimer, 1)
vizact.ontimer(1.5, mytimer, 0)
vizact.onkeydown('b', ball.setPosition, [0,1.8,5])

if(len(sys.argv) > 1):
	viz.go(viz.EMBEDDED, window=int(sys.argv[1]))
	while True:
		viz.updateframe()
else:
	viz.go()
and here's the vizard box control:
Code:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace vizardbox
{
    public partial class VizardBox : UserControl
    {
        public String VizardAdditionalStartupArguments
        {
            get { return (String)GetValue(VizardAdditionalStartupArgumentsProperty); }
            set { SetValue(VizardAdditionalStartupArgumentsProperty, value); }
        }
        public bool VizardConsole
        {
            get { return (bool)GetValue(VizardConsoleProperty); }
            set { SetValue(VizardConsoleProperty, value); }
        }
        public String VizardScript
        {
            get { return (String)GetValue(VizardScriptProperty); }
            set { SetValue(VizardScriptProperty, value); }
        }
        public String VizardInstallation
        {
            get { return (String)GetValue(VizardInstallationProperty); }
            set { SetValue(VizardInstallationProperty, value); }
        }
        public static readonly DependencyProperty VizardAdditionalStartupArgumentsProperty = DependencyProperty.Register("VizardAdditionalStartupArguments", typeof(String), typeof(VizardBox), new UIPropertyMetadata(""));
        public static readonly DependencyProperty VizardConsoleProperty = DependencyProperty.Register("VizardConsole", typeof(bool), typeof(VizardBox), new UIPropertyMetadata(false));
        public static readonly DependencyProperty VizardScriptProperty = DependencyProperty.Register("VizardScript", typeof(String), typeof(VizardBox), new UIPropertyMetadata(""));
        public static readonly DependencyProperty VizardInstallationProperty = DependencyProperty.Register("VizardInstallation", typeof(String), typeof(VizardBox), new UIPropertyMetadata("C:\\Program Files (x86)\\WorldViz\\Vizard4\\bin\\winviz.exe"));


        vizHwndHost vh;
        public VizardBox()
        {
            InitializeComponent();
        }
        public void Go()
        {
            vh = new vizHwndHost();
            _hostborder.Child=vh;
            vh.go(VizardScript, VizardInstallation, VizardAdditionalStartupArguments, VizardConsole);
        }

        public void Stop()
        {
            _hostborder.Child = null;
            vh.stop();
        }
    }

    public class vizHwndHost : HwndHost
    {
        IntPtr hwndVizardHandle;
        Process vizardProc;
        ~vizHwndHost()
        {
            stop();
            DestroyWindow(hwndVizardHandle);
        }
        public void stop()
        {
            if (vizardProc != null)
                if(!vizardProc.HasExited)
                    vizardProc.Kill();
        }
        public void go(string script, string vizardLocation, string additionalStartupArguments, bool console)
        {
            vizardProc = new Process();
            vizardProc.StartInfo.FileName = vizardLocation;
            vizardProc.StartInfo.Arguments = (console? "-console" : "") + " \"" + script + "\" " + hwndVizardHandle.ToString() + " " + additionalStartupArguments;
            vizardProc.Start();
        }
        protected override HandleRef BuildWindowCore(HandleRef hwndParent)
        {
            hwndVizardHandle = IntPtr.Zero;
            hwndVizardHandle = CreateWindowEx(0, "static", "",
                                      WS_CHILD | WS_VISIBLE,
                                      0, 0,
                                      0, 0,
                                      hwndParent.Handle,
                                      (IntPtr)HOST_ID,
                                      IntPtr.Zero,
                                      0);
            return new HandleRef(this, hwndVizardHandle);
        }
        protected override IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            handled = false;
            return IntPtr.Zero;
        }
        public void setFocus()
        {
            SetFocus(hwndVizardHandle);
        }
        protected override void OnGotMouseCapture(MouseEventArgs e)
        {
            base.OnGotMouseCapture(e);
            e.Handled = true;
        }
        protected override void DestroyWindowCore(HandleRef hwnd)
        {
            DestroyWindow(hwnd.Handle);
        }
        //PInvoke declarations
        [DllImport("user32.dll", EntryPoint = "CreateWindowEx", CharSet = CharSet.Unicode)]
        internal static extern IntPtr CreateWindowEx(int dwExStyle,
                                                      string lpszClassName,
                                                      string lpszWindowName,
                                                      int style,
                                                      int x, int y,
                                                      int width, int height,
                                                      IntPtr hwndParent,
                                                      IntPtr hMenu,
                                                      IntPtr hInst,
                                                      [MarshalAs(UnmanagedType.AsAny)] object pvParam);
        [DllImport("user32.dll", EntryPoint = "DestroyWindow", CharSet = CharSet.Unicode)]
        internal static extern bool DestroyWindow(IntPtr hwnd);
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
        [DllImport("user32.dll")]
        static extern IntPtr SetFocus(IntPtr hWnd);
        internal const int
          WS_CHILD =       0x40000000,
          WS_VISIBLE =     0x10000000,
          LBS_NOTIFY =     0x00000001,
          HOST_ID =        0x00000002;
    }
}
Reply With Quote
 

Tags
<viz>.go, csharp, embed, win32, wpf

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
recording screen in vizard when embedded in wxpython Renato Lima Vizard 0 11-21-2011 01:10 PM
Vizard 4 Beta Testing farshizzo Announcements 0 02-01-2011 10:46 AM
Vizard 4 Beta Testing farshizzo Vizard 0 02-01-2011 10:46 AM
Vizard tech tip: Using the Python Imaging Library (PIL) Jeff Vizard 0 03-23-2009 11:13 AM
embedded Vizard tavaksai Vizard 5 12-21-2004 07:49 AM


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


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