2010年5月28日 星期五

在C#中啟用及關閉多點觸控

在.net 4還沒有完全成熟之前,要開發win7的多點觸控程式
可以透過Windows 7 Multitouch .NET Interop Sample Library
請參考建立多點觸控應用程式

但是有時候並不希望另外使用其他的函式庫
這時候可以透過簡單的Win32 API達到同樣的效果

[DllImport("User32.dll", SetLastError = true)]
public static extern bool SetProp(
IntPtr hWnd, string lpString, IntPtr hData);

[DllImport("User32.dll", SetLastError = true)]
public static extern IntPtr GetProp(
IntPtr hWnd, string lpString);

const int TABLET_ENABLE_MULTITOUCHDATA = 0x01000000;
const string TPS = "MicrosoftTabletPenServiceProperty";

bool EnableMultiStylus()
{
/// get current window handle
Window w = Application.Current.MainWindow;
IntPtr h = new WindowInteropHelper(w).Handle;

/// get current tablet property
IntPtr tp = GetProp(h, TPS);

/// set with enabled multi-touch flag
return SetProp(h, TPS,
new IntPtr(tp.ToInt32() |
TABLET_ENABLE_MULTITOUCHDATA));
}

在這之後就可以直接使用stylus的事件來接收多個觸控點的事件
不過這時候如果註冊了滑鼠事件,就會發現滑鼠事件也被影響了
第二點下去及動作同時也會觸發滑鼠事件,進而造成困擾
(因為滑鼠事件沒辦法判斷哪個事件是由哪個點引發的)
所以記得在不需要使用的時候把多點觸控事件給關掉

bool DisableMultiStylus()
{
/// get current window handle
Window w = Application.Current.MainWindow;
IntPtr h = new WindowInteropHelper(w).Handle;

/// get current tablet property
IntPtr tp = GetProp(h, TPS);

/// set with disabled multi-touch flag
return SetProp(h, TPS,
new IntPtr(tp.ToInt32() &
~TABLET_ENABLE_MULTITOUCHDATA));
}

--
參考資料
建立多點觸控應用程式
SetProp Function
GetProp Function
IRealTimeStylus3::MultiTouchEnabled Property

沒有留言:

張貼留言