【发布时间】:2015-02-17 11:08:30
【问题描述】:
我有一个专门用于 Win8.1 的 C# WPF 应用程序(桌面应用程序,不是 Metro)。
我希望用户能够使用触摸注入,但我正在尝试禁用窗口为点击手势按住并拖动(如在桌面上选择多个文件)和其他手势(缩放滚动等)创建的可视化反馈.
在网上搜索了很长时间后,我发现了这个帖子: How do I disable Windows 8 touch contact visualizations for my application? 所以我试着做同样的事情......
我试过了(会把我的 Win32 课放在最后)
public void DisableGestureVisualization()
{
const int SPI_SETCONTACTVISUALIZATION = 0x2019;
const int SPI_SETGESTUREVISUALIZATION = 0x201B;
ulong gv = 0;
Logger.Debug(!Win32.SystemParametersInfo(SPI_SETGESTUREVISUALIZATION, 0, ref gv, 0)
? @"Failed SystemParametersInfo SPI_SETGESTUREVISUALIZATION"
: @"Successfuly returned from SystemParametersInfo SPI_SETGESTUREVISUALIZATION");
Logger.Debug(!Win32.SystemParametersInfo(SPI_SETCONTACTVISUALIZATION, 0, ref gv, 0)
? @"Failed SystemParametersInfo SPI_SETCONTACTVISUALIZATION"
: @"Successfuly returned from SystemParametersInfo SPI_SETCONTACTVISUALIZATION");
}
还有这个:
public void TryDisableWindowsVisualFeedback(IntPtr hWnd)
{
bool enable = false;
foreach (Win32.FEEDBACK_TYPE type in Enum.GetValues(typeof(Win32.FEEDBACK_TYPE)))
{
if (type == Win32.FEEDBACK_TYPE.FEEDBACK_MAX)
{
continue;
}
Logger.Debug(!Win32.SetWindowFeedbackSetting(hWnd, type, 0, 4, ref enable)
? @"Failed to SetWindowFeedbackSetting for " + type
: @"Successfuly returned from SetWindowFeedbackSetting for " + type);
}
}
我从我的 WPF 应用程序中这样称呼它:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Window window = Window.GetWindow(this);
var wih = new WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;
TryDisableWindowsVisualFeedback(hWnd);
}
这是我的辅助 Win32 类:
internal class Win32
{
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SystemParametersInfo(
uint uiAction,
uint uiParam,
ref ulong pvParam,
uint fWinIni
);
public enum FEEDBACK_TYPE : uint
{
FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,
FEEDBACK_PEN_BARRELVISUALIZATION = 2,
FEEDBACK_PEN_TAP = 3,
FEEDBACK_PEN_DOUBLETAP = 4,
FEEDBACK_PEN_PRESSANDHOLD = 5,
FEEDBACK_PEN_RIGHTTAP = 6,
FEEDBACK_TOUCH_TAP = 7,
FEEDBACK_TOUCH_DOUBLETAP = 8,
FEEDBACK_TOUCH_PRESSANDHOLD = 9,
FEEDBACK_TOUCH_RIGHTTAP = 10,
FEEDBACK_GESTURE_PRESSANDTAP = 11,
FEEDBACK_MAX = 0xFFFFFFFF
}
[DllImport("user32.dll")]
public static extern bool SetWindowFeedbackSetting(
IntPtr hwnd,
FEEDBACK_TYPE feedback,
uint dwFlags,
uint size,
[In] ref bool configuration
);
}
以上都没有禁用圆形灰色点击视觉反馈,也没有禁用按住和拖动时出现的白色小圆圈。
我什至尝试使用博客中的 C# 示例:
Windows.UI.Input.PointerVisualizationSettings.
GetForCurrentView().
IsContactFeedbackEnabled = false;
此代码适用于 Metro 应用程序,因此我尝试了 This SO post 并获得了 Windows 命名空间,但在运行代码时我得到了
"An unhandled exception of type 'System.Exception' occurred in MyProg.exe
WinRT information: Element not found.
Additional information: Element not found."
据我所知,桌面应用程序不支持PointerVisualizationSettings,所以这种方式注定要失败......
如果有人能帮我解决这个问题,请帮忙。
谢谢
【问题讨论】:
标签: c# winapi windows-runtime touch windows-8.1