windows滑鼠訊息
最開始為windows訊息迷惑的時候是一個叫做sendMessage的函式:
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM ,
LPARAM
);
最後的兩個引數在不同的情況下到底應該怎麼來賦值呢?後來又遇到了視窗過程函式:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),後面的兩個引數在不同的訊息下分別代表什麼意思呢?
曾經四處搜尋過,但是沒有滿意的答覆,這兩天在看《windows程式設計》,把關於滑鼠這部分內容記錄下來,作個筆記。
滑鼠訊息:
滑鼠訊息有21種,可以分為三類:
1.命中測試訊息WM_NCHITTEST(我的理解:以WM開頭的嚴格來說是訊息名稱,完整的訊息應該是個結構體MSG msg,該訊息名稱為msg.wParam,但是一般訊息和訊息名稱似乎分的不是很仔細)。
它是優先於任何接下來要說到的客戶區和非客戶區的滑鼠訊息。因為其餘20種滑鼠訊息都是基於它的基礎之上產生的。也就是說user用滑鼠點選之後首先產生的是WM_NCHITTEST訊息,然後經視窗函式的DefWindowProc返回一個值,這個值將成為新的滑鼠訊息的wParam值。
注意:不要被這裡的字面字母所迷惑,WM_NCHITTEST雖然有NC作為字首,但是它不僅是產生非客戶區滑鼠訊息的基礎同時也是客戶區訊息的產生基礎。
經由WM_NCHITTEST訊息產生的值可以是任意非客戶區滑鼠訊息的wParam值再加上以下四種中的一種:
HTCLIENT 客戶區
HTNOWHERE 不在視窗中
HTTRANSPARENT 視窗被另外一個視窗覆蓋
HTERROR 使得DefWindowProc產生蜂鳴聲
舉個例子:如果DefWindowProc返回的是HTCLIENT ,那麼windows將把螢幕座標轉換為客戶區座標併產生客戶區滑鼠訊息。
lParam包含的是滑鼠位置的螢幕座標
wParam沒有用。
2.客戶區滑鼠訊息(10個):左:WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK
中:WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK
右:WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK
滑鼠移動訊息:WM_MOUSEMOVE
lParam含有滑鼠位置的座標,低字位是x座標,高字位是y座標,當然此時它們是客戶區座標。可以用
x=LOWORD(lParam);
y=HIWORD(lParam);
來表示。
如果要轉化為螢幕座標,可用:
ClientToScreen(hWnd,&pt);
wParam用來指示滑鼠鍵和shift和Ctrl的狀態:
MK_LBUTTON
MK_MBUTTON
MK_RBUTTON
MK_SHIFT
MK_CONTROL
舉例:如果要表示收到了WM_LBUTTON和按下了shift,那麼可以表示為:wParam&MK_SHIFT
3.非客戶區滑鼠訊息(10個。完全和客戶區那九個訊息名稱相對應,就是前面加了字首NC表示no_client):
左:WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK
中:WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK
右:WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_NCRBUTTONDBLCLK
滑鼠移動訊息:WM_NCMOUSEMOVE
同樣的,lParam含有滑鼠位置的座標,低字位是x座標,高字位是y座標,但是此時它們是螢幕座標。也可以用
x=LOWORD(lParam);
y=HIWORD(lParam);
來表示。
如果要轉化為客戶區座標,可用:
ScreenToClient(hWnd,&pt);
wParam指示滑鼠所在的非客戶區的位置(非座標),由
HTCLIENT
HTNOWHERE
HTTRANSPARENT
HTERROR
四個中的某個表示
鍵盤訊息:
擊鍵訊息:WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP
wParam 包括了虛擬鍵碼,如VK_SPACE VK_CANCEL之類的東東
lParam 包括了了解擊鍵非常有用的其他資訊,如重複計數、環境程式碼、鍵的先前狀態、轉換狀態、OEM掃描碼等。具體參見《windows程式設計》P.201
字元訊息:WM_CHAR WM_SYSCHAR WM_DEADCHAR WM_SYSDEADCHAR
事實上,字元訊息也是由擊鍵訊息經TranslateMessage轉換而來。如WM_CHAR和WM_DEADCHAR是從WM_KEYDOWN得到的;WM_SYSCHAR和WM_SYSDEADCHAR由WM_SYSKEYDOWN得到的。
wParam不是虛擬鍵碼,而是ANSI或UNICODE字元程式碼
lParam與擊鍵訊息的lParam相同
其餘訊息:
WM_SIZE:
lParam包含了客戶區的大小,同樣的低字位的表示x(寬度),高字位的表示y(高度);
wParam表示視窗大小的狀態,即:
SIZE_MAXIMIZED Window has been maximized. 最大化
SIZE_MINIMIZED Window has been minimized. 最小化
SIZE_RESTORED Window has been resized, but neither SIZE_MINIMIZED nor SIZE_MAXIMIZED applies.既非最大也非最小,並不極端。
SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized.
SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size.
WM_CREATE:
其中lParam是指向結構體型別CREATESTRUCT的一個指標,其中包含了程式例項hInstance,故可通過(LPCREATESTRUCT)lParam->hInstance獲取該例項,這和通過函式GetWindowProc(hWnd,GWL_HINSTANCE)效果是一樣的
WM_COMMAND:
這個訊息一般是在主視窗上點選其子視窗如按鈕、選單、複選框等才會產生的訊息(這裡的例外是滾動控制(就是可以在客戶區的任何地方出現的滾動條子視窗),它是不會發送該訊息的)。點選這些這些Button時候,向父視窗傳送該訊息,其中
LOWORD(wParam) 子視窗ID
HIWORD (wParam) 通知碼(如BN_CLICKED、BN_PAINT、BN_PUSHED、BN_UNPUSHED、BN_DISABLE、BN_DBLCLK、 BN_SETFOCUS、BN_KILLFOCUS)
lParam 子視窗控制代碼
注意:
1.此時當點選子視窗時,子視窗獲得焦點,但是它會忽略除Spacebar鍵之外的所有鍵盤輸入,此時Spacebar和滑鼠的效果一樣;
2.當子視窗為選單時,它給視窗傳送該訊息時wParam和lParam和其他有點不一樣:
HIWORD (wParam) :0
lParam :0
WM_CTLCOLORBTN(WM_CTLCOLORSCROLLBAR、WM_CTLCOLORSTATIC):
一般用來由子視窗傳送給父視窗,從而改變子視窗的顯示顏色(詳見P.348)
wParam是子視窗(比如說按鈕)的裝置描述表(這也意味著當父視窗獲得該訊息時,子視窗已經取得裝置描述表了,否則如何傳遞給父視窗呢?)
lParam是子視窗的視窗控制代碼
WM_DRAWITEM:
這是在子視窗(如按鈕等)在被建立、改動時候由windows傳送給父視窗的wndProc的。就按鈕具體情況而言:如果該按鈕是BS_OWNERDRAW風格的話,那麼在這麼幾種情況下是會發送給其父視窗的:建立、按下或被釋放、得到或失去焦點、被重新著色。
對於其它的子視窗,比如說複選框、單選框、列表框、選單等是否和按鈕一致,書上沒說,我也沒經過試驗,不清楚。以後回來說明,或者哪位哥們看到這裡告訴我。。
lParam是個指向DRAWITEMSTRUCT結構的指標,該結構包含了很多內容,有按鈕的hDC、rectItem(按鈕的尺寸)、CtrlID(控制視窗ID)、itemState(按鈕狀態,如是否擁有輸入焦點)
滾動條訊息WM_VSCROLL WM_HSCROLL:
lParm可以用來區分“視窗滾動條(一般意義上的滾動條)”和“滾動控制”,對於前者該值是0,對於後者該值是滾動控制的視窗控制代碼
wParam暫時不清楚其包含的含義,但是對於這兩個滾動條訊息該值是相同的。(P.357)
WM_INITMENU(不常用):
wParam: 主選單控制代碼
lParam: 0
WM_SELECTMENU:
當用戶的游標在選單上面上下移動時該訊息被髮送給視窗(即意味著可以幫助實現包含對選單欄文字描述的狀態列)。
LOWORD(wParam): 選中項:選單ID或者彈出式選單控制代碼
HIWORD(wParam) : 選擇標誌(可以是以下組合:MF_GRAYED、MF_DISABLED、MF_CHECKED、MF_BITMAP、MF_POPUP、MF_HELP、MF_SYSMENU、MF_MOUSESELECT)
lParam :包含選中項的選單控制代碼
WM_INITMENUPOPUP:
當顯示一個彈出選單前給視窗傳送該訊息。
wParam: 彈出式選單控制代碼
LOWORD(lParam):彈出式選單索引
HIWORD(lParam):系統選單為1,其他為0.
WM_MENUCHAR:
該訊息實際並非選單訊息。當用戶按下ALT和一個與選單項不匹配的字元時,或者當顯示彈出式選單而使用者按下一個與彈出式選單裡的項不匹配的字元時將傳送給視窗該訊息。
LOWORD(wParam) :字元程式碼(ASCII或者UNICODE)
HIWORD(wParam) :選擇碼(可以是0:不顯示彈出式選單;MF_POPUP:顯示出彈出式選單;MF_SYSMENU:顯示系統出彈出式選單)
lParam :選單控制代碼
相關推薦
windows滑鼠訊息
最開始為windows訊息迷惑的時候是一個叫做sendMessage的函式: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM , LPARAM ); 最後的兩個引數在不同的情況下到底應該怎麼來賦值呢?後來又遇到
Windows滑鼠鍵盤訊息處理
轉載自 https://www.cnblogs.com/ht-beyond/p/4445439.html #include <windows.h> #include <tchar.h> //swprintf_s函式所需的標頭檔案 #pragma comme
windows程式設計(14):滑鼠訊息詳解
關於滑鼠的一些細節知識: 通常,我們發訊息時,都是對一個特定的視窗,但是對於滑鼠訊息卻不然:只要滑鼠跨越視窗或者在某視窗中按下滑鼠按鍵,那麼視窗訊息處理程式就會收到滑鼠訊息,而不管該視窗是否活動或者是否擁有輸入焦點。滑鼠訊息一個有21種:10個顯示區域訊息,11個非顯示區域
windows基礎應用程式程式設計(七)滑鼠訊息
上一篇中,我們介紹了鍵盤訊息,接下來,我們來了解一下滑鼠訊息。 在上一篇中,我們知道Windows只把鍵盤訊息傳送給擁有輸入焦點的視窗。滑鼠訊息與此不同,只要滑鼠跨越視窗或者在某視窗中按下滑鼠鍵,那麼視窗過程就會受到滑鼠訊息,而不管該視窗是否活動或者是否擁有輸入焦點。同鍵盤
windows簡單訊息勾取和dll注入
來源《逆向工程核心原理》 執行notepad.exe可以劫持notepad.exe的鍵盤輸入 HookMain.cpp //HookMain.cpp #include"stdio.h" #include"conio.h" #include"windows.h"
c#控制windows 滑鼠移動、點選和輸入
首先可以使用ViewWizard獲取視窗的類名和Title 圖中:視窗標題和視窗類名,可以使用下面的程式獲取視窗的控制代碼。 MouseHookHelper 滑鼠相關的函式 using System; using System.Collections.Gen
Windows的訊息機制要點
執行緒B收到了執行緒A發來的訊息,並進行處理, 在處理過程中,B也向執行緒A SendMessgae,然後等待從A返回。 因為此時, 執行緒A正等待從執行緒B返回, 無法處理B發來的訊息, 從而導致了執行緒A,B相互等待, 形成死鎖。多個執行緒也可以形成環形死鎖。 可以使用 SendNotifyMessage
(Windows程式設計)Windows的訊息機制(訊息的結構、型別)
Windows應用程式是以訊息為基礎、以事件為驅動的應用程式。當應用程式在執行時,會不斷地等待作業系統傳送給自身的訊息(while迴圈),然後根據不同的訊息進行相應的處理。這裡的訊息實際
7.3 非客戶區滑鼠訊息
摘錄於《Windows程式(第5版,珍藏版).CHarles.Petzold 著》P230 到目前為止,所有討論的 10 種滑鼠訊息都是發生在視窗客戶區內的移動或單擊。如果滑鼠位於視窗內部除客戶區外的其他區域,Windows 就會向視窗過程傳送一個“非客
7.2 客戶區滑鼠訊息
摘錄於《Windows程式(第5版,珍藏版).CHarles.Petzold 著》P223 第 6 章已經講到,Windows 只把鍵盤訊息傳送到當前具有輸入焦點的視窗。滑鼠訊息則不同:當滑鼠經過視窗或在視窗內被單擊,則即使該視窗是非活動視窗
Windows的訊息定義大全
Windows視窗訊息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H"//訊息值的定義來源 #include "Dde.h"//D
09 滑鼠訊息
Windows滑鼠訊息 windows有20多種不同的訊息用來報告與滑鼠有關的輸入事件,這些訊息分為視窗客戶區訊息和非視窗客戶區訊息,通常我們只關心客戶區訊息。常見的滑鼠訊息有如下幾種: WM_MOUSEMOVE WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTOND
SDL之滑鼠訊息
在SDL中有一個結構體SDL_Event存放SDL存放事件。將該結構體的地址傳入SDL_PollEvent,便可以知道發生了什麼事件。 #include "SDL.h" #include "SDL_image.h" int main(int argc, char* argv[]) {
客戶區滑鼠訊息、非客戶區滑鼠訊息、擊中測試、滑鼠滾輪
注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚! 注:以下內容多數摘自《Windows程式設計》 1. 滑鼠資訊 判斷是否連線了滑鼠
滑鼠訊息與鍵盤訊息
1,虛擬鍵(VK_*) 鍵盤上每一個鍵對應一個掃描碼,掃描碼是OEM廠商制定的,不同的廠商生產的鍵盤同樣一個按鍵的掃描碼都有可能出現不一致的情況,為了擺脫由於系統裝置不一致的情況,通過鍵盤驅動程式將掃描碼對映為統一的虛擬鍵碼錶示,從而達到所有的裝置都有一個統一的虛擬鍵,
[MFC]滑鼠訊息處理
1. 滑鼠事件和滑鼠訊息: 1) 滑鼠和游標的區別:滑鼠是指實體滑鼠,而游標就是滑鼠在螢幕上的表示,因此在程式設計中通常稱為游標; 2) 滑鼠事件:Windows中分為是三種,按下或釋放滑鼠、雙擊滑鼠、移動滑鼠; 3) 上述三種滑鼠實際那將觸發滑鼠訊
使用鉤子函式獲取全部的滑鼠訊息和鍵盤訊息
// HookTest1Dlg.cpp : 實現檔案 // #include "stdafx.h" #include "HookTest1.h" #include "HookTest1Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DE
CLR自定義.NET控制元件製作(4)——滑鼠訊息的響應
1 #include "stdafx.h" 2 #ifdef _DEBUG 3 #define new DEBUG_NEW 4 #endif 5 #include "myview.h" 6 7 IMPLEMENT_DYNCREATE(CMyView, CView) 8 9 BEGIN_MESSAGE_
Win32學習筆記——滑鼠訊息
一 滑鼠訊息 1 滑鼠訊息 WM_LBUTTONDOWN WM_LBUTTONUP WM_RBUTTONDOWN WM_RBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDBLCLK WM_MOUSEWHEEL 2 訊息的引數 WPARAM -當前鍵
滑鼠訊息處理
滑鼠操作是Windows的重要內容,為了下一章用滑鼠作圖,本章先作一些基礎知識的鋪墊,以免下一章新內容太多。前面章節已經說過,視窗函式總共處理訊息結構體中的三個內容,即message、wParam、lParam,其中message是主訊息,wParam、lParam許多場