Wyłączanie funkcji RealTimeStylus dla aplikacji WPF

Program Windows Presentation Foundation (WPF) ma wbudowaną obsługę przetwarzania danych wejściowych dotykowych systemu Windows 7. Obsługa odbywa się za pośrednictwem danych wejściowych pióra platformy tabletu w czasie rzeczywistym jako zdarzenia OnStylusDown, OnStylusUpi OnStylusMove. System Windows 7 udostępnia również obsługę wielodotykową poprzez komunikaty okien Win32 WM_TOUCH. Te dwa interfejsy API wykluczają się wzajemnie na tym samym HWND. Włączenie wprowadzania dotykowego za pośrednictwem platformy tabletu (ustawienie domyślne dla aplikacji WPF) powoduje wyłączenie WM_TOUCH komunikatów. W związku z tym, aby używać WM_TOUCH do odbierania komunikatów dotykowych z okna WPF, należy wyłączyć wbudowaną obsługę rysików w WPF. Ma to zastosowanie w scenariuszu, takim jak okno WPF hostujące składnik korzystający z WM_TOUCH.

Aby wyłączyć nasłuchiwanie WPF na wejścia rysika, usuń wszelkie wsparcie tabletu dodane przez okno WPF.

Przykład

Poniższy przykładowy kod pokazuje, jak usunąć domyślną obsługę platformy tabletu przy użyciu odbicia.

public static void DisableWPFTabletSupport()
{
    // Get a collection of the tablet devices for this window.
    TabletDeviceCollection devices = System.Windows.Input.Tablet.TabletDevices;

    if (devices.Count > 0)
    {
        // Get the Type of InputManager.
        Type inputManagerType = typeof(System.Windows.Input.InputManager);

        // Call the StylusLogic method on the InputManager.Current instance.
        object stylusLogic = inputManagerType.InvokeMember("StylusLogic",
                    BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
                    null, InputManager.Current, null);

        if (stylusLogic != null)
        {
            //  Get the type of the stylusLogic returned from the call to StylusLogic.
            Type stylusLogicType = stylusLogic.GetType();

            // Loop until there are no more devices to remove.
            while (devices.Count > 0)
            {
                // Remove the first tablet device in the devices collection.
                stylusLogicType.InvokeMember("OnTabletRemoved",
                        BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                        null, stylusLogic, new object[] { (uint)0 });
            }
        }

    }
}

Zobacz także