我正在为C#/ WPF应用中的Kinect SDK构建一个手势系统。我想为放大镜放大和缩小添加手势。我更喜欢使用内置的Windows放大镜或其底层逻辑,但任何获得类似效果(多显示器感知)的方法都可以。
如何以编程方式调用Windows放大镜的缩放功能?
到目前为止,我唯一希望找到的是启动该过程并通过Win32单击按钮;但当我这样做时,当我调用放大镜窗口的手柄时,它会拉出一个空白的空窗口。
我通过结合我所知道的C#,一堆Win32 API调用,我真的不太了解,以及大量的Google搜索来修补这些代码。
private void ZoomIn()
{
// Make sure the Magnifier is running, and get its handle
if (Process.GetProcesses().Where(p => p.ProcessName.ToLower() == "magnify").Count() == 0) {
Process.Start("magnify.exe");
System.Threading.Thread.Sleep(500); }
IntPtr handle = Process.GetProcesses().Where(p => p.ProcessName.ToLower() == "magnify").First().Handle;
// Figure out what size ("mode") it's in
WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
placement.length = Marshal.SizeOf(placement);
GetWindowPlacement(handle, ref placement);
// Move the Magnifier to a predetermined location so we know where to click
MoveWindow(handle, new Point(0, 0));
// If Magnifier is in small mode, click it to put it in big mode.
if (placement.rcNormalPosition.Size.Width == 132) {
SetCursorPos(15, 15);
mouse_event((int)HardwareEvents.MouseLeftDown, 15, 15, 0, 0);
mouse_event((int)HardwareEvents.MouseLeftUp, 15, 15, 0, 0); }
// Click the zoom in button. Yeah, I know, hackish. Isn't Win32 awesome?
SetCursorPos(25, 25);
mouse_event((int)HardwareEvents.MouseLeftDown, 25, 25, 0, 0);
mouse_event((int)HardwareEvents.MouseLeftUp, 25, 25, 0, 0);
}
private void MoveWindow(IntPtr handle, Point point)
{
// TODO: Figure out how to look up the target window's size
SetWindowPos(handle, new IntPtr((int)SpecialWindowHandles.HWND_TOP), (int)point.X, (int)point.Y, 500, 500, SetWindowPosFlags.ShowWindow);
}
private struct WINDOWPLACEMENT {
public int length;
public int flags;
public int showCmd;
public System.Drawing.Point ptMinPosition;
public System.Drawing.Point ptMaxPosition;
public System.Drawing.Rectangle rcNormalPosition; }
[DllImport("user32.dll")]
static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndl);
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public static class HardwareEvents
{
public static int MouseMove = 0x0001;
public static int MouseLeftDown = 0x0002, MouseLeftUp = 0x0004;
public static int MouseRightDown = 0x0008, MouseRightUp = 0x0010; // best guess on the 0010
public static int MiddleMouseDown = 0x20, MiddleMouseUp = 0x40;
public static int MouseWheel = 0x800;
}
答案 0 :(得分:1)
您可以发送Windows快捷键
Win + =
用于启动放大镜
Win + +
用于放大
Win + -
缩小
Windows Input Simulator是一个很好的库,用于发送Windows徽标密钥
等密钥答案 1 :(得分:1)
解决。此代码发送Win +击键。
keybd_event(0x5B, 0x45, 0, new UIntPtr(0));
keybd_event(0xBB, 0x45, 1, new UIntPtr(0));
http://msdn.microsoft.com/en-us/library/ms646280(v=vs.85).aspx