iT邦幫忙

0

C# winform 在 win10 怎麼關閉觸控滑動或攔截觸控手勢?

[遇到的問題]

目前想做的功能是在主 Panel (後稱 MainPanel)中放多個 Panel(包含圖片、Label、Button等元件,後稱 ItemPanel)按鈕。在觸控螢幕上下滑動來捲動 MainPanel 。

一開始測試其實不用特別加什麼事件在 MainPanel 滑動就可以移動卷軸了,類似在滑手機時那種效果,但如果按到 ItemPanel 開始滑就沒有反應。說起來也是很合理,所以就在 ItemPanel 及其包含的元件加上 MouseEvent 來實作捲動效果了。

但這時候遇到一個很神奇的問題,就是如果我先去滑動 MainPanel 的話,要放置一段時間後才能去點 ItemPanel 做滑動。如果一直嘗試去滑動,等候時間就會延長 ..

先不考慮換改用 WFP 及 UWP 來製作的情況下 … 有人遇到過這個問題或知道怎麼處理嗎?

[嘗試過的解決方法]

  1. 直接從 win10 關掉滑動手勢:
    但找不到地方可以關, Google 到的資訊是去 Pen And Touch 那邊設定,但看到的設定視窗中沒有那些頁面 orz

  2. 在 MainPanel 上面也加滑鼠事件:
    用滑鼠的時候是正常,但用觸控的時候還是 Windows 的手勢事件優先。

  3. 在 MainPanel 複寫 WndProc 攔截 gesture 事件:
    有成功捕捉到事件,但仍然沒能阻止手勢事件作用,不知道是不是我寫錯…

WndProc 攔截的程式

const int WM_GESTURENOTIFY = 0x11a;
const int WM_TABLET_QUERYSYSTEMGESTURESTATUS = 0x2cc;
const int TABLET_DISABLE_FLICKS = 0x00010000;

[DllImport("user32")]
static extern bool SetProp(IntPtr hWnd, string lpString, IntPtr hData);

protected override void WndProc(ref Message m)
{
  if (m.Msg == WM_TABLET_QUERYSYSTEMGESTURESTATUS) {
      return;
  }
  switch (m.Msg)
  {
      case WM_GESTURENOTIFY:
          SetProp(this.Handle, "MicrosoftTabletPenServiceProperty",
                  new IntPtr(0x10000));
          return;
      case WM_TABLET_QUERYSYSTEMGESTURESTATUS:
          // 方法1. 直接 return
          return;
          // 方法2. set Message.Result
          m.Result = (IntPtr)TABLET_DISABLE_FLICKS;
      default:
          base.WndProc(ref m);          
          break;
  }
}
  1. 在 MainPanel 空著的地方全放上 Label 加滑鼠事件:
    這是目前使用的方式…雖然是會 work 但覺得應該有更好或更正確的方式來解決這個問題 orz

無論如何感謝看完我的問題 <(_ _)>

尚未有邦友回答

立即登入回答