问题描述: 我的winform是用于触摸屏的,我想在我的winform程序中
获取全局的触摸屏长按事件,是全局的,就是说要在整个屏幕的任何地方
都能够获取到,而不仅仅在winform界面中。
提出问题:我查找了很久,似乎都没有合适的方案或想关代码,挺纠结的。
这个要求能真正做到吗?恳请大家指点或提供相关学习代码,期待中。
如何获取触摸屏长按事件
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
16条回答 默认 最新
关注引自免费微信小程序:皆我百晓生
要实现全局触摸屏长按事件的捕获,您可以创建一个Windows服务应用程序,它将监听全局多点触控输入,并在检测到长按时触发相应的事件。以下是一种基于C#的实现方法:
-
创建Windows服务项目
首先,您需要创建一个新的Windows服务项目。在Visual Studio中,选择“文件”>“新建”>“项目”,然后选择“Windows服务 (.NET Framework)”模板。为项目命名(例如
TouchscreenLongPressService),并指定一个位置进行保存。 -
安装必要的NuGet包
在解决方案资源管理器中右击项目,选择“管理 NuGet 程序包”。搜索并安装以下包:
System.Windows.FormsMicrosoft.Win32.SystemEvents
这些包将为服务提供对WinForms事件和系统级事件的访问。
-
编写服务逻辑
打开
Service1.cs文件,替换现有代码为以下内容:using System; using System.Diagnostics; using System.ServiceProcess; using System.Threading; using System.Windows.Forms; using Microsoft.Win32; namespace TouchscreenLongPressService { public partial class TouchscreenLongPressService : ServiceBase { private const int LongPressThresholdMs = 500; // 可调整长按阈值(毫秒) private readonly object _eventLock = new object(); private DateTime? _lastTouchTimestamp; private Timer _longPressTimer; public TouchscreenLongPressService() { InitializeComponent(); } protected override void OnStart(string[] args) { RegisterGlobalTouchEvents(); StartLongPressDetectionTimer(); } protected override void OnStop() { UnregisterGlobalTouchEvents(); StopLongPressDetectionTimer(); } private void RegisterGlobalTouchEvents() { // 注册全局触摸事件 HwndSource source = HwndSource.FromHwnd(IntPtr.Zero); if (source != null) { source.AddHook(WndProc); } } private void UnregisterGlobalTouchEvents() { // 取消注册全局触摸事件 HwndSource source = HwndSource.FromHwnd(IntPtr.Zero); if (source != null) { source.RemoveHook(WndProc); } } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x24E: // WM_TOUCH lock (_eventLock) { // 清除已有的长按计时器 _lastTouchTimestamp = null; _longPressTimer.Stop(); // 重新开始计时 _lastTouchTimestamp = DateTime.Now; _longPressTimer.Start(); } break; } return IntPtr.Zero; } private void StartLongPressDetectionTimer() { _longPressTimer = new Timer(OnLongPressTimerElapsed, null, Timeout.Infinite, Timeout.Infinite); _longPressTimer.Interval = LongPressThresholdMs; } private void StopLongPressDetectionTimer() { _longPressTimer?.Dispose(); _longPressTimer = null; } private void OnLongPressTimerElapsed(object state) { lock (_eventLock) { if (_lastTouchTimestamp.HasValue && DateTime.Now - _lastTouchTimestamp.Value >= TimeSpan.FromMilliseconds(LongPressThresholdMs)) { // 触发长按事件 Debug.WriteLine("Global touch long press detected."); // 在这里添加您的长按事件处理逻辑 // ... // 清除已记录的触摸时间戳 _lastTouchTimestamp = null; } } } } } -
安装与运行服务
完成代码编写后,按F6编译项目。接下来,您需要将服务安装到系统中并启动它:
-
打开命令提示符(以管理员身份)。
-
导航到项目输出目录(通常为
bin\Debug或bin\Release)。 -
使用以下命令安装服务:
installutil.exe TouchscreenLongPressService.exe -
如果没有错误消息,服务已成功安装。现在可以通过“服务”控制面板(
services.msc)启动服务。
-
至此,您已创建了一个Windows服务,它可以监听全局触摸屏输入并在检测到长按时触发相应事件。根据需要,您可以在
OnLongPressTimerElapsed方法中添加具体的长按事件处理逻辑。请注意,由于安全和权限限制,直接在服务中与用户界面交互可能不被允许或可能导致问题。如果您需要在长按时显示UI反馈或其他交互操作,请考虑通过其他方式(如通知、托盘图标、IPC通信等)与用户界面进行通信。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录-