Windows學習筆記14 滑鼠相關

2021-06-20 10:02:35 字數 3948 閱讀 5020

鍵盤便於輸入和操作文字資料,而滑鼠則便於畫圖和操作圖形物件。

1、滑鼠基礎

<1>、***確認pc系統是否安裝了滑鼠的測試方法:使用getsystemmetrics函式。

用法:bool bmouse = getsystemmetrics(sm_mousepresent);

如果安裝了滑鼠,fmouse返回true(非0),如果沒有安裝,則返回false。

*** 確認所安裝滑鼠上的按鍵個數,使用以下方法:

int cbuttons = getsystemmetrics(sm_mousebuttons); 

如果沒有安裝滑鼠,返回0。

*** 判斷是否設定切換為左手習慣的滑鼠:使用getsystemmetrics中的sm_swapbutton引數。

<2>、幾個簡單定義

滑鼠游標:當使用者移動滑鼠時,windows在顯示器上移動的乙個小位圖。

熱點:滑鼠游標指向的顯示器上的精確位置的小圖素。

<3>、只要滑鼠劃過視窗或者在某視窗中按下滑鼠按鍵,那麼視窗過程就會收到滑鼠訊息,而不管該視窗是否活動或擁有輸入焦點,windows為滑鼠定義了21種訊息。

對於所有滑鼠訊息,訊息的lparam值包含滑鼠的位置資訊:低字為x座標,高字為y座標。這兩個座標是相對於視窗左上角的位置。x = loword(lparam); y = hiword(lparam);

訊息的wparam的值指示的是滑鼠按鍵以及shift和ctrl鍵的狀態。以mk開頭表示「滑鼠按鍵」。mk_lbutton:按下左鍵;mk_mbutton:按下中鍵;mk_rbutton:按下右鍵;mk_shift:按下shift鍵;mk_control:按下ctrl鍵。

例如:如果收到了wm_lbuttondown訊息,而且值wparam & mk_shift是true,則表示在滑鼠左鍵按下的同時,也按下了shift鍵。

<4>、需要注意的兩點

*當滑鼠不在視窗範圍內時,視窗過程可以「攔截滑鼠訊息」並連續地接收滑鼠訊息。

*當正在顯示乙個系統模態訊息框或系統模態對話方塊時,那麼其他程式就不能接收滑鼠訊息。而且當系統模態訊息框或模態對話方塊活動時,禁止切換到其他視窗或程式。

2、shift鍵、ctrl鍵的處理:

方法1:

例如在收到wm_mousemove訊息時,處理shift\ctrl:

if(wparam & mk_shift)

else

} else

else

} 方法2:使用getkeystate函式返回按鍵狀態

getkeystate函式使用虛擬鍵碼vk_lbutton、vk_rbutton、vk_mbutton、vk_shift和vk_control來傳回滑鼠按鍵和shift鍵的狀態。

3、雙擊滑鼠按鍵

*如果希望視窗過程能夠接收到雙擊滑鼠的訊息,那麼在設計視窗類時應該在視窗風格裡包含cs_dblclks識別字:如:wndclass.style = cs_hredraw | cs_vredraw | cs_dblclks;

注:如果wndclass未包含cs_dblclks風格,則使用者短時間內雙擊滑鼠左鍵,視窗過程會收到兩組lbuttondown和lbuttonup訊息:

如果wndclass包含cs_dblclks風格,則此時第二組的lbuttondown訊息將由lbuttondblclk替換。

雙擊的第一次按鍵訊息是處理單擊訊息(lbuttondown)。

4、非顯示區域滑鼠訊息

視窗的非顯示區域包括標題列、功能表和視窗捲動列。

如果滑鼠在視窗的顯示區域之外,但還在視窗內,windows給視窗過程傳送一條「非顯示區域」滑鼠訊息。

非顯示區域滑鼠訊息中含有字母「nc」:表示是非顯示區域訊息。

<1>、非顯示區域滑鼠訊息種類:

wm_ncmousemove、wm_nclbuttondown、wm_ncmbuttondown、wm_ncrbuttondown、wm_nclbuttonup、wm_ncmbuttonup、wm_ncrbuttonup、wm_nclbuttondblclk、wm_nc_mbuttondblclk、wm_rbuttondblclk。

<2>、非顯示區域滑鼠訊息的wparam和lparam引數

wparam引數指明移動或按滑鼠按鍵的「非顯示區域」,是以ht開頭的識別字(ht表示「命中測試」);

lparam引數的低字為x座標,高字為y座標。注意,它們是「螢幕座標」。

<3>命中測試訊息

「wm_nchittest」訊息表示「非顯示區域命中測試」。此訊息優先於所有其他滑鼠訊息(包括顯示區域和非顯示區域)。lparam引數含有滑鼠位置的x和y螢幕座標,wparam引數沒有用。

windows應用程式通常把這個訊息傳送給defwindowproc,然後windows用wm_nchittest訊息產生與滑鼠位置相關的其他滑鼠訊息。

對於非顯示區域滑鼠訊息,在處理wm_nchittest時,從defwindowproc傳回的值將成為滑鼠訊息的wparam引數,這個值可以是任意非顯示區域滑鼠訊息再加上以下值之一:htclient(顯示區域)、htnowhere(不在視窗中)、httransparent(視窗被另乙個視窗覆蓋)、hterror(使defwindowproc產生警示用的嘩聲)。

如果defwindowproc在處理wm_nchittest訊息後傳回htclient,那麼windows將把螢幕座標轉換為客戶區座標並產生顯示區域滑鼠訊息。

<4>、遮蔽滑鼠訊息

在視窗過程中加入以下**:

case  wm_nchittest:

return (lresult) htnowhere;

這樣就可以遮蔽所有滑鼠訊息(包括顯示區域和非顯示區域)。這時當滑鼠在視窗中(包括系統功能表圖示、縮放按鈕、關閉按鈕)時,滑鼠按鍵就會失效。

5、使用鍵盤模擬滑鼠

<1>、小知識:即時沒有安裝滑鼠,windows仍然會顯示乙個滑鼠游標。windows為這個游標儲存乙個「顯示計數」,如果安裝了滑鼠,顯示計數會被初始化為0,否則,顯示計數會被初始化為-1,只有在顯示計數非負時才顯示滑鼠游標。增加顯示計數,可以呼叫showcursor(true);要減少顯示計數,可以呼叫showcursor(false);

*獲得游標的位置:getcursorpos(&pt);

*設定游標位置:setcursorpos(x, y);//注意這裡x,y都是螢幕座標。

*注意:getcursorpos傳回的座標表示滑鼠的當前位置,滑鼠訊息的lparam引數中的座標是產生訊息時滑鼠的位置。

6、子視窗與鍵盤

注意:父視窗和子視窗可能共用鍵盤訊息,即子視窗和父視窗各自的視窗過程獲得鍵盤訊息沒有先後次序。

但是,滑鼠訊息就不一樣了,滑鼠訊息是由父視窗的視窗過程先獲得的。

7、攔截滑鼠訊息

乙個視窗過程通常只在滑鼠游標位於視窗的顯示區域,或非顯示區域時才接收滑鼠訊息。如果程式要在滑鼠游標位於視窗之外時,接收滑鼠訊息,則程式可以自行攔截滑鼠。

攔截滑鼠訊息的方法:

呼叫setcapture(hwnd);

釋放攔截的方法:

呼叫releasecapture();

當滑鼠訊息被攔截時,滑鼠訊息將傳送到攔截視窗,滑鼠的座標是相對於攔截視窗的客戶區座標。

注意:32位windows系統,對滑鼠訊息的攔截做了較多限制,這樣做可以防止乙個程式在攔截滑鼠之後而不釋放它而引起整個系統混亂。

如果滑鼠訊息被當前視窗攔截,而滑鼠在沒有按下的情況下移動到另乙個視窗,那麼攔截將失效,將由滑鼠游標下面的視窗接收滑鼠訊息;

攔截滑鼠時,滑鼠按下的情況下移動到另乙個視窗,則當滑鼠按鍵被釋放時,才釋放攔截。

8、滑鼠滑輪

按下滑鼠滑輪,它的功能相當於滑鼠中鍵;

轉動滑輪,會產生wm_mousewheel訊息。

<1>、關於wm_mousewheel訊息

lparam引數包含滑鼠位置資訊,wparam引數的低字組包含一些標誌,用於標識滑鼠按鍵、shift、ctrl鍵的狀態。

wparam的高字組,其中有乙個「data」值,該值目前可以是120 和-120(表示滑輪向前或向後轉動,檔案將向上或向下轉動3行)。

《Windows核心程式設計》學習筆記(14) 堆

堆非常適合分配大量的小型資料。它是用來管理鍊錶和樹的最佳方式。但是它分配和釋放記憶體塊的速度比虛擬記憶體和記憶體對映檔案要慢,而且也無法再對物理儲存器的調撥和撤銷調撥進行直接控制。乙個程序同時可以有多個堆,程序在整個生命週期內可以建立和銷毀這些堆。但是,預設的堆是在程序開始執行之前由系統自動建立的,...

Perl 學習筆記 14

system是呼叫shell的最簡單的方法。例如 system ls l home system date exec是 呼叫後不用管 的system。使用 env獲得環境變數。例如 env home rootbeer bin env path delete env my make result sy...

Python學習筆記 14

本節主要有 tips 如果不想改變原資料,傳遞引數時盡量用其副本 函式也是乙個物件 物件是記憶體中專門用來儲存資料的一塊區域 一切皆物件 函式的引數 defrt a print zzzz a rt 3 def sum a,b,c print a b c sum 4,5,8 定義形參時可以指定默值,沒...