5

C#/WPFアプリでKinectSDKのジェスチャーシステムを構築しています。拡大鏡のズームインとズームアウトのジェスチャを追加したいと思います。組み込みのWindowsMagnifierまたはその基盤となるロジックを使用したいのですが、同様の効果(マルチモニター対応)を取得する方法はどれでも機能します。

Windows拡大鏡のズーム機能をプログラムで呼び出すにはどうすればよいですか?

これまでのところ、私が希望を持って見つけた唯一のことは、プロセスを開始し、Win32を介してボタンをクリックすることです。しかし、そうすると、拡大鏡ウィンドウのハンドルを呼び出すと、空白の空のウィンドウが表示されます。

このコードには、C#について知っていること、よくわからない一連のWin32 API呼び出し、および大量のグーグルを組み合わせてパッチを適用しました。

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;
}
4

2 に答える 2

1

Windowsのショートカットキーを送信できます

Win + =拡大鏡を起動
Win + +してズームインし
Win + -てズームアウトする

Windows Input Simulatorは、Windowsロゴキーなどのキーを送信するための優れたライブラリです。

于 2011-06-20T23:18:36.977 に答える
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

于 2011-06-20T23:51:43.360 に答える