深入理解wparam參數

一、參數概述

wparam是Windows操作系統中消息處理機制中一個重要的參數,它一般用於攜帶消息的附加數據和控制消息的行為。具體而言,wparam的數據類型是WPARAM,它是一個32位無符號整數,其值的含義、作用以及處理方式根據發送或接收的消息不同而不同。

消息機制是Windows操作系統的核心機制之一,它實現了進程間通信的基礎。消息機制是指通過消息傳遞的機制來實現進程間數據和通信的一種方式。在Windows系統中,消息機制是通過發送和接收消息進行的。發送消息的窗口將一個消息傳遞給接收消息的窗口,這個傳遞的過程就是消息機制。

二、常見消息中的wparam參數詳解

1. WM_COMMAND 消息

wParam參數:
如果命令是加速鍵,則此值為加速鍵的 ASCII 字符值。例如,如果用戶按下 ALT+F,則 wParam 將為 'F'。

如果命令來自控件,則此值是控件的標識符。當然,如果您的應用程序由多個對話框組成,則需要相應地修改標識符。

否則,此值是菜單項的標識符。如果系統菜單被選中,則此值是包含菜單項的菜單的句柄。

2. WM_KEYDOWN 消息

wParam參數:
重複計數(位30-16) —— 重複計數指定如何處理自動重複擊鍵。當用戶按住一個鍵時,系統將在短時間內重複發送相同的消息。由於這可能會導致性能下降,因此 Windows 將嘗試根據用戶的鍵盤速度和重複延遲來動態選擇重複計數。如果應用程序不處理此消息,那麼應用程序將接收一系列 WM_KEYDOWN 和 WM_KEYUP 消息,以指示用戶有哪些鍵被按下。

擴展鍵(位24) —— 如果是擴展鍵,則此位設置為 1。

先前鍵狀態(位0) —— 該位指示這個鍵是在上一次事件中被按下還是被放開。該位被設置為 1,以指示鍵是在上一次事件中被釋放的。完整的鍵狀態信息可在消息的 lParam 參數中獲得。

3. WM_LBUTTONDOWN 消息

wParam參數:在這種情況下,此參數沒有意義。

4. WM_PAINT 消息

wParam參數:
如果更新區已被擦除,則此值為非零。否則它的值為零。

5. WM_NCLBUTTONDOWN 消息

wParam參數:
與 WM_LBUTTONDOWN 消息的 wParam 參數相同。然而,在 WM_NCLBUTTONDOWN 消息中,這個值指示了按下的鼠標鍵,可以是下面列出的值之一:

WPARAM             鼠標鍵
MK_LBUTTON         左鍵
MK_RBUTTON         右鍵
MK_SHIFT           SHIFT 鍵
MK_CONTROL         CTRL 鍵
MK_MBUTTON         中間鍵
MK_XBUTTON1	       X1 鼠標鍵
MK_XBUTTON2	       X2 鼠標鍵

三、代碼示例

case WM_COMMAND:
    {
        int wmId = LOWORD(wParam);
        // 分析菜單選擇: 
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;

case WM_KEYDOWN:
{
    switch (wParam)
    {
        case VK_RIGHT:
            xSpeed = 1;
            ySpeed = 0;
            break;

        case VK_LEFT:
            xSpeed = -1;
            ySpeed = 0;
            break;

        case VK_UP:
            xSpeed = 0;
            ySpeed = -1;
            break;

        case VK_DOWN:
            xSpeed = 0;
            ySpeed = 1;
            break;

        default:
            break;
    }
}
break;

case WM_LBUTTONDOWN:
{
    // do something
}
break;

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    // TODO: 在此添加任意繪圖代碼...
    EndPaint(hWnd, &ps);
}
break;

case WM_NCLBUTTONDOWN:
{
    if (wParam == MK_LBUTTON)
    {
        // do something
    }
}
break;

四、結語

通過對wparam參數的詳細闡述和常見消息中對wparam參數的應用,我們可以更加深刻地理解Windows操作系統中消息機制的實現原理,提高對消息處理的認識和技能。

原創文章,作者:EWNVW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/369348.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EWNVW的頭像EWNVW
上一篇 2025-04-12 13:01
下一篇 2025-04-12 13:01

相關推薦

  • 三星內存條參數用法介紹

    本文將詳細解釋三星內存條上面的各種參數,讓你更好地了解內存條並選擇適合自己的一款。 一、容量大小 容量大小是內存條最基本的參數,一般以GB為單位表示,常見的有2GB、4GB、8GB…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python input參數變量用法介紹

    本文將從多個方面對Python input括號里參數變量進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Spring Boot中發GET請求參數的處理

    本文將詳細介紹如何在Spring Boot中處理GET請求參數,並給出完整的代碼示例。 一、Spring Boot的GET請求參數基礎 在Spring Boot中,處理GET請求參…

    編程 2025-04-29
  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • Python Class括號中的參數用法介紹

    本文將對Python中類的括號中的參數進行詳細解析,以幫助初學者熟悉和掌握類的創建以及參數設置。 一、Class的基本定義 在Python中,通過使用關鍵字class來定義類。類包…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 全能編程開發工程師必知——DTD、XML、XSD以及DTD參數實體

    本文將從大體介紹DTD、XML以及XSD三大知識點,同時深入探究DTD參數實體的作用及實際應用場景。 一、DTD介紹 DTD是文檔類型定義(Document Type Defini…

    編程 2025-04-29
  • Python可變參數

    本文旨在對Python中可變參數進行詳細的探究和講解,包括可變參數的概念、實現方式、使用場景等多個方面,希望能夠對Python開發者有所幫助。 一、可變參數的概念 可變參數是指函數…

    編程 2025-04-29
  • XGBoost n_estimator參數調節

    XGBoost 是 處理結構化數據常用的機器學習框架之一,其中的 n_estimator 參數決定着模型的複雜度和訓練速度,這篇文章將從多個方面詳細闡述 n_estimator 參…

    編程 2025-04-28

發表回復

登錄後才能評論