aierda 2024-04-11 18:47 采纳率: 72.1%
浏览 74
已结题

如何获取触摸屏长按事件

问题描述: 我的winform是用于触摸屏的,我想在我的winform程序中
获取全局的触摸屏长按事件,是全局的,就是说要在整个屏幕的任何地方
都能够获取到,而不仅仅在winform界面中。
提出问题:我查找了很久,似乎都没有合适的方案或想关代码,挺纠结的。
这个要求能真正做到吗?恳请大家指点或提供相关学习代码,期待中。

  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-11 18:47
    关注

    引自免费微信小程序:皆我百晓生

    要实现全局触摸屏长按事件的捕获,您可以创建一个Windows服务应用程序,它将监听全局多点触控输入,并在检测到长按时触发相应的事件。以下是一种基于C#的实现方法:

    1. 创建Windows服务项目

      首先,您需要创建一个新的Windows服务项目。在Visual Studio中,选择“文件”>“新建”>“项目”,然后选择“Windows服务 (.NET Framework)”模板。为项目命名(例如 TouchscreenLongPressService),并指定一个位置进行保存。

    2. 安装必要的NuGet包

      在解决方案资源管理器中右击项目,选择“管理 NuGet 程序包”。搜索并安装以下包:

      • System.Windows.Forms
      • Microsoft.Win32.SystemEvents

      这些包将为服务提供对WinForms事件和系统级事件的访问。

    3. 编写服务逻辑

      打开 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;
                      }
                  }
              }
          }
      }
      
    4. 安装与运行服务

      完成代码编写后,按F6编译项目。接下来,您需要将服务安装到系统中并启动它:

      • 打开命令提示符(以管理员身份)。

      • 导航到项目输出目录(通常为 bin\Debugbin\Release)。

      • 使用以下命令安装服务:

        installutil.exe TouchscreenLongPressService.exe
        
      • 如果没有错误消息,服务已成功安装。现在可以通过“服务”控制面板(services.msc)启动服务。

    至此,您已创建了一个Windows服务,它可以监听全局触摸屏输入并在检测到长按时触发相应事件。根据需要,您可以在 OnLongPressTimerElapsed 方法中添加具体的长按事件处理逻辑。

    请注意,由于安全和权限限制,直接在服务中与用户界面交互可能不被允许或可能导致问题。如果您需要在长按时显示UI反馈或其他交互操作,请考虑通过其他方式(如通知、托盘图标、IPC通信等)与用户界面进行通信。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(15条)

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 创建了问题 4月11日