2009年7月1日 星期三

Disable flicks and mouse pointer

當我們在Win7底下, 利用一些手勢操作應用程式時, 發現OS預設會幫你作了某些動作; 例如用單一手指很快在視窗上劃一撇, 會出現flicks的游標. 但可能因為某些需求, 我們不希望有這些游標出現在畫面上, 比方, 我們想要用單一手指pan拖曳物體, 卻老出現flick游標, 這確實就影響到pan的功能.

下面我們就來介紹, 如何關掉某些手勢反應的功能, 基本上, 有兩種方法可以關掉此功能, 第一種就是在系統中修改環境設定, 另一種就是在程式中, 設定MICROSOFT_TABLETPENSERVICE_PROPERTY的flag.

系統設定
1. 打開控制台(Control Panel) ==> 點選Pen and Touch
2. 關掉Flicks, 如下圖所示, 將Use flicks to perform common actions quickly and easily的勾選取消



3. 關掉Touch pointer, 如下圖所示, 將Show the touch pointer when I'm interacting with item on the screen的勾選取消





在程式中修改MICROSOFT_TABLETPENSERVICE_PROPERTY
在tpcshrd.h中, 我們可以找到WM_TABLET_QUERYSYSTEMGESTURESTATUS message 的定義, 下面的flag可以用來開啟或關閉某些手勢
#define TABLET_DISABLE_PRESSANDHOLD        0x00000001
#define TABLET_DISABLE_PENTAPFEEDBACK 0x00000008
#define TABLET_DISABLE_PENBARRELFEEDBACK 0x00000010
#define TABLET_DISABLE_TOUCHUIFORCEON 0x00000100
#define TABLET_DISABLE_TOUCHUIFORCEOFF 0x00000200
#define TABLET_DISABLE_TOUCHSWITCH 0x00008000
#define TABLET_DISABLE_FLICKS 0x00010000
#define TABLET_ENABLE_FLICKSONCONTEXT 0x00020000
#define TABLET_ENABLE_FLICKLEARNINGMODE 0x00040000
#define TABLET_DISABLE_SMOOTHSCROLLING 0x00080000
#define TABLET_DISABLE_FLICKFALLBACKKEYS 0x00100000
#define TABLET_ENABLE_MULTITOUCHDATA 0x01000000



下面的sample code說明如何在Win32的視窗中, 關掉flicks游標:

#include<tpcshrd.h>
[...]
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
[...]
const DWORD_PTR dwHwndTabletProperty =
TABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture
TABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves)
TABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down
TABLET_DISABLE_FLICKS; // disables pen flicks (back, forward, drag down, drag up)

ATOM atom = GlobalAddAtom(MICROSOFT_TABLETPENSERVICE_PROPERTY);

SetProp(hWnd,
MICROSOFT_TABLETPENSERVICE_PROPERTY,
reinterpret_cast(dwHwndTabletProperty));

GlobalDeleteAtom(atom);
}


參考資料:
http://msdn.microsoft.com/en-us/library/bb969148(VS.85).aspx

2 則留言:

  1. 我嘗試用上面的代碼,可是編譯過程總是報錯,是MICROSOFT_TABLETPENSERVICE_PROPERTY的定義問題,不知道怎么解決呢?

    回覆刪除
  2. 你有引用tpcshrd的標頭檔嗎?
    #include "tpcshrd.h"

    回覆刪除