gpt4 book ai didi

wpf - 禁用鼠标升级

转载 作者:可可西里 更新时间:2023-11-01 09:29:20 27 4
gpt4 key购买 nike

有没有什么方法可以从代码中禁用鼠标提升,即阻止窗口将触摸事件解释为鼠标事件?

我在我的 WPF 应用程序中捕获触摸事件,我不希望这些交互影响鼠标指针的可见性和位置。

有一个TouchFrameEventArgs.SuspendMousePromotionUntilTouchUp Method这似乎正是这样做的。遗憾的是,它仅适用于 Silverlight 和 Windows Phone。

此外,还有一些系统设置可用于禁用双击和右键单击提升,但不能禁用整个鼠标提升。

Windows 8 特定解决方案或低级别解决方案也会有所帮助。

最佳答案

禁用鼠标触摸提升的普通 Win32 API 方法是处理窗口 WindowProc 中的 WM_POINTER* 消息。 (实际上,似乎 WM_POINTERDOWN 就足够了)并且不调用 DefWindowProc()

这是我们在一些商业应用中实际做的,也是建议的here .

这仅适用于 Windows 8 及更高版本,因为 WM_POINTER* 消息不是由 Windows 7 及更低版本生成的。

现在,在 WPF 世界中,这变得更加复杂。

首先,为了让 WPF 堆栈正确处理 WM_POINTER*,您首先需要

(在这里报告代码,以防MS页面消失)你需要在你的app.config文件中插入这个:

<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>

现在新 Shiny 的 WPF 堆栈已激活,但即使您处理了 OnTouchDown,它也会出现错误并移动鼠标光标。 , OnTouchUp , OnTouchMove事件并设置 Handled标记为真。

我们发现,通过使用 HwndSourceHook并阻止 WM_POINTERDOWN消息,鼠标光标最终保持静止(尽管我们阻止了所有触摸交互!)

因此,我们推断 Shiny 的新 WPF 实际上正在调用 DefWindowProc,即使我们正在处理 OnTouch* 事件也是如此。

我们的想法是使用 Microsoft Detours ,以拦截 DefWindowProc 调用,并阻止 WM_POINTERDOWN 到达真正的 DefWindowProc

绕行代码是:

#include <Windows.h>
#include <detours.h>

static LRESULT(WINAPI * _originalDefWindowProcA)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) = DefWindowProcA;
static LRESULT(WINAPI * _originalDefWindowProcW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) = DefWindowProcW;

static LRESULT WINAPI myDefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_POINTERDOWN:
return 0;

default:
return _originalDefWindowProcA(hWnd, Msg, wParam, lParam);
}
}

static LRESULT WINAPI myDefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_POINTERDOWN:
return 0;

default:
return _originalDefWindowProcW(hWnd, Msg, wParam, lParam);
}
}

void SetupDefWindowProcDetour()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)_originalDefWindowProcA, myDefWindowProcA);
DetourAttach(&(PVOID&)_originalDefWindowProcW, myDefWindowProcW);
DetourTransactionCommit();
}

注意:SetupDefWindowProcDetour 必须由应用的主 (UI) 线程调用。

关于wpf - 禁用鼠标升级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com