1. 程式人生 > >windows訊息機制中lparam與wparam兩個引數的分析

windows訊息機制中lparam與wparam兩個引數的分析

一. WPARAM 和 LPARAM 本質上沒有什麼區別:都是32位數,

但是區別也還是有的:MICROSOFT在使用時兩種引數分別代表不同的含義和內容,WPARAM常常代表一些控制元件的ID或者高位低位組合起來分別表示滑鼠的位置,如果訊息的傳送者需要將某種結構的指標或者是某種型別的控制代碼時,習慣上用LPARAM來傳遞,可以參考各種控制元件的通知訊息:可以檢視:EN_CHANGE (EDIT控制元件的一個通知訊息),CBEM_INSERTITEM(可擴充套件組合框的可接受訊息)等等來加以領會。

理論上在使用自定義訊息時,WPARAM LPARAM的含義可以程式設計師任意指定的,但是最好遵從MFC中的習慣。在呼叫SendMessage()函式時,第二個引數是WPARAM,第三個引數是這個訊息的LPARAM,但是你在程式中某個類中寫下ON_MESSAGE()巨集來處理這個訊息時,處理函式SomeHandler(WPARAM,LPRAM(預設是0))中解釋這兩個引數時必須按照SendMessage呼叫中的意義來進行。

二.訊息響應機制

1、訊息的組成:一個訊息由一個訊息名稱(UINT),和兩個引數(WPARAM,LPARAM)。當用戶進行了輸入或是視窗的狀態發生改變時系統都會發送訊息到某一個視窗。例如當選單選中之後會有WM_COMMAND訊息傳送,WPARAM的高字中(HIWORD(wParam))是命令的ID號,對選單來講就是選單ID。當然使用者也可以定義自己的訊息名稱,也可以利用自定義訊息來發送通知和傳送資料。

2、誰將收到訊息:一個訊息必須由一個視窗接收。在視窗的過程(WNDPROC)中可以對訊息進行分析,對自己感興趣的訊息進行處理。例如你希望對選單選擇進行處理那麼你可以定義對WM_COMMAND進行處理的程式碼,如果希望在視窗中進行圖形輸出就必須對WM_PAINT進行處理。

3、未處理的訊息到那裡去了:M$為視窗編寫了預設的視窗過程,這個視窗過程將負責處理那些你不處理訊息。正因為有了這個預設視窗過程我們才可以利用Windows的視窗進行開發而不必過多關注視窗各種訊息的處理。例如視窗在被拖動時會有很多訊息傳送,而我們都可以不予理睬讓系統自己去處理。

4、視窗控制代碼:說到訊息就不能不說視窗控制代碼,系統通過視窗控制代碼來在整個系統中唯一標識一個視窗,傳送一個訊息時必須指定一個視窗控制代碼表明該訊息由那個視窗接收。而每個視窗都會有自己的視窗過程,所以使用者的輸入就會被正確的處理。例如有兩個視窗共用一個視窗過程程式碼,你在視窗一上按下滑鼠時訊息就會通過視窗一的控制代碼被髮送到視窗一而不是視窗二。

訊息的傳遞過程是: 訊息-->視窗控制代碼-->視窗過程

5、示例:下面有一段虛擬碼演示如何在視窗過程中處理訊息

LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM) { switch(uMessageType) {//使用SWITCH語句將各種訊息分開 case(WM_PAINT): doYourWindow(...);//在視窗需要重新繪製時進行輸出 break; case(WM_LBUTTONDOWN): doYourWork(...);//在滑鼠左鍵被按下時進行處理 break; default: callDefaultWndProc(...);//對於其它情況就讓系統自己處理 break; } }

接下來談談什麼是訊息機制:系統將會接收到一個或多個訊息佇列,所有產生的訊息都回被放入或是插入佇列中。系統會在佇列中取出每一條訊息,根據訊息的接收控制代碼而將該訊息傳送給擁有該視窗的程式的訊息迴圈。每一個執行的程式都有自己的訊息迴圈,在迴圈中得到屬於自己的訊息並根據接收視窗的控制代碼呼叫相應的視窗過程。而在沒有訊息時訊息迴圈就將控制權交給系統所以Windows可以同時進行多個任務。下面的虛擬碼演示了訊息迴圈的用法:

while(1) { id=getMessage(...); if(id == quit) break; translateMessage(...); }當該程式沒有訊息通知時getMessage就不會返回,也就不會佔用系統的CPU時間。



相關推薦

windows訊息機制lparamwparam引數分析

一. WPARAM 和 LPARAM 本質上沒有什麼區別:都是32位數, 但是區別也還是有的:MICROSOFT在使用時兩種引數分別代表不同的含義和內容,WPARAM常常代表一些控制元件的ID或者高位低位組合起來分別表示滑鼠的位置,如果訊息的傳送者需要將某種結構的指標或者是

linuxchmodchown命令詳解

In 第一個 ID 利用 root chown 資料 後綴 沒有 在linux系統中chmod,chown命令都可以來設置權限了,但它們也是有區別的,下文小編為各位介紹chmod與chown兩個命令用法與區別介紹。 今天要分享的2個命令也是我們平時常用的,chmod與cho

java方法的傳參機制以及利用反射交換引數

Java方法的值傳遞機制可以訪問這篇部落格:https://www.cnblogs.com/lixiaolun/p/4311863.html, 今天我要寫的是如何利用反射來交換兩個變數的值。 private static void swap(Integer x, Integer y) {

windows訊息機制ASP.net winform控制元件訊息傳遞之滑鼠點選click事件

window系統是一個訊息驅動的系統, windows作業系統本身有自己的訊息佇列,訊息迴圈,它捕捉鍵盤,滑鼠的動作生成訊息,並將這個訊息傳給應用程式的訊息佇列。 當用戶用滑鼠click桌面時,其實使用者是不能直接接觸到某個控制元件的。表面上看,的確是使用者用

windows 訊息機制、視窗過程執行緒間訊息傳遞

按照自己的理解好好整理一遍 訊息機制 windows是一個訊息驅動的系統,會有一個總的系統訊息的佇列,滑鼠、鍵盤等等都會流入到這個佇列中,同時會為每個執行緒維護一個訊息佇列(注意預設是有GUI呼叫的執行緒才有,對於沒有GUI或者視窗的執行緒,只有當線上程內呼叫get/pe

Pythonossys模塊的區別

des ren 異常類 函數 出現 輸出 func lena info <os和sys的官方解釋> ?os os: This module provides a portable way of using operating system depe

C#-----------------------------回收機制Destroynull的作用

icon des www ocl 技術 比較 view 情況 它的 關於Object被Destroy之後,該Object的原引用==null的問題 標簽: unityc#繼承對象 2017-01-23 23:32 506人閱讀 評論(0) 收藏 舉報 分類:

在Java,如何把String[]合併為一個 list 合併有異曲同工之妙

在Java中,如何把兩個String[]合併為一個? 看起來是一個很簡單的問題。但是如何才能把程式碼寫得高效簡潔,卻還是值得思考的。這裡介紹四種方法,請參考選用。 一、apache-commons 這是最簡單的辦法。在apache-commons中,有一個ArrayUtils.addAll

AndroidonTouchonClick種監聽的完全解析

之前專案中做一個豎直方向的ViewPager效果(詳見我的另一篇博文),這幾天做了幾個改動,突然發現我設定的OnTouchListener對觸控事件的監聽突然不起作用了,琢磨了半天覺得問題就出在onTouch的返回值true還是false上,後來自己測試的時候發現不光與這個有關,與OnClickLi

學習筆記10.4----Windows訊息機制

1)作業系統訊息機制:百度百科——訊息機制 解釋的很清楚。作業系統掃描輸入裝置狀態-(轉換為訊息)-傳送給焦點窗體 ,對於每一個正在執行的Windows應用程式,系統為其建立一個“訊息佇列”。 2)control的invoke,begin invoke .委託的invok

Android Handler訊息機制的諸多疑問

前言 網上總是有很多闡述Android訊息機制的文章,基本上大同小異,都是講Handle,Message,Looper,MessageQueue這四個類會如何協同工作的。但是動腦筋的童鞋們可能總是會有如下的一些疑問,我翻閱了數多微博,很多年了,也沒有看到相關比較

python學習--python實現按鍵精靈之windows訊息機制文章整理

1.如何利用Python和win32程式設計避免重複性體力勞動(一)——開始、FindWindow和FindWindowEx http://blog.csdn.net/seele52/article/details/17504925 2.如何利用Python和win32程式設計避免重

windows下virtualboxUbuntu主機通過ssh建立連線的方法

    最近在學習Linux系統下程式設計的內容,在搭建環境的時候有一個部分是用ssh工具實現主機和虛擬機器之間互動,中間遇到了一些問題,通過在網上查詢資料發現有不少是針對vmware的,而我使用的是

windows訊息機制詳解

MessageBox("ComboBox 選項"+str+" selected!"); 在按鈕1 的響應函式OnButton1()中新增程式碼: m_tab1.SetCurSel(0); NMHDR nmhdr; nmhdr.code=TCN_SELCHANGE; nmhdr.hwndFrom=GetDlgI

180108 逆向-Windows訊息機制(鍵盤訊息

1625-5 王子昂 總結《2018年1月8日》 【連續第465天總結】 A. Windows訊息系統-鍵盤訊息 B. 鍵盤訊息 概述 應用程式從系統接收到的關於鍵盤的訊息可以分為兩類:擊鍵和字元。 物理層面上,對於某個按鍵(例如A),會發出“按

windows訊息機制

一 Windows中有一個系統訊息佇列,對於每一個正在執行的Windows應用程式,系統為其建立一個“訊息佇列”,即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作“訊息迴圈”的程式碼,用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。 二 Win

MFC(一)——WINDOWS訊息機制

建立一個完整的視窗需要經過下面四個操作步驟: 設計一個視窗類; 註冊視窗類; 建立視窗; 顯示及更新視窗。 #include <Windows.h> #include <stdio.h> LRESULT CALLBACK Wi

Windows訊息機制以及相關API

 訊息系統對於一個win32程式來說十分重要,它是一個程式執行的動力源泉。一個訊息,是系統定義的一個32位的值,他唯一的定義了一個事件,向 Windows發出一個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠、改變視窗尺寸、按下鍵盤上的一個鍵都會使Windows傳送一個訊

淺談jQueryfind()filter()種方法聯絡區別

首先,這兩種方法都屬於jQuery遍歷函式方法,下面小編將分開淺談一下這兩種方法 find()方法 我們通過W3C手冊瞭解到,find()方法的定義是獲得當前元素集合中每個元素的後代,通過選擇器、j

決策樹之視覺化windowslinux版本

                      決策樹視覺化 決策樹的程式設計實戰 使用鳶尾花卉資料集訓練一棵決策樹,並繪製出來: 程式如下: '''使用鳶尾花卉資料集來訓練決策樹 '''fromsk