Jadual Kandungan
一、 什么是消息
二、 消息获取
2.1 消息队列
循环" >2.2 消息循环
三、消息处理
Rumah Operasi dan penyelenggaraan operasi dan penyelenggaraan tingkap Win32 SDK基础(八)之 关于Windows消息机制的详解(图)

Win32 SDK基础(八)之 关于Windows消息机制的详解(图)

Jun 06, 2017 am 10:02 AM

一、 什么是消息

        在解释什么是消息之前,我们先讨论一下程序的执行机制问题。大体上说,程序按照执行机制可以分为两类:
第一类是过程驱动。比如我们最早接触编程时写的C程序,又或者单片机程序。这类程序往往预先已经设定好了执行流程,我们执行时只是按部就班的执行;
第二类是事件驱动。事件,相信大家都能够理解。每个事件的发生都是随机的,每个事件都会有发生的时刻,类似生活中的事件。程序中的事件也会有自己的触发点,事件驱动程序就是事先编写好了针对每个事件的处理流程。在Windows的操作系统中,消息就是Windows中的事件。Windows中的几乎每个操作都会触发消息,像我们之前讲过的创建窗口会触发WM_CREATE消息,绘制窗口会触发WM_PAINT消息,我们点击鼠标、键盘、都会触发相应的消息。
        Windows的消息被封装成了一个叫做MSG的结构体,其原型如下:

typedef struct tagMSG { // msg 
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
Salin selepas log masuk

Hwnd —— 触发消息的窗口的句柄。
Message —— 消息ID。Windows操作系统为每个消息都分配了一个消息ID,这个ID是唯一的。我们在上文中提到过的WM_CREATE本质就是一个整数,就是消息ID。
wParam —— 消息可附带的参数。
lParam —— 消息可附带的参数。
Time —— 发生消息的时刻。
Pt —— 发生消息时鼠标所在的位置。
以上参数对消息来说,缺一不可。
Windows中就是将一个个消息封装成MSG对象发送消息时,将这些对象放置到消息队列中;获取消息时,也是获取的这些MSG对象。

二、 消息获取

2.1 消息队列

我们说过,在Windows中几乎每个操作都会触发一条消息,这些消息都被发送到消息队列中。何为消息队列?我们可以将其理解为使用了一个存放Msg对象的先进先出的Deque—— Deque。消息队列分为两种,一种是系统消息队列,另外一种是进程消息队列。我们在触发消息后,消息先进入系统消息队列。操作系统处理后会根据消息的的窗口句柄hwnd值将消息分配到我们程序自己的消息队列,然后在我们程序内部进行消息的处理。

2.2 消息循环

在前面的文章中,我们曾经写过一个消息循环。所谓的消息循环,就是不断的读取我们的进程中的消息队里中的消息,然后在进行处理。

void Message()  
{  
    MSG nMsg = { 0 };  
    while (GetMessage(&nMsg, NULL, 0, 0))  
    {  
        TranslateMessage(&nMsg);  
        DispatchMessage(&nMsg);  
    }  
}
Salin selepas log masuk


这里面,GetMessage()不断的在消息队列中抓取消息,其函数原型如下:
GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
lpMsg —— 用来存放消息的MSG类型的指针。
hWnd —— 指定取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息。
wMsgFilterMin —— 指定被检索的最小消息值的整数。
wMsgFilterMax —— 指定被检索的最大消息值的整数。

GetMessage()获取到消息后,TranslateMessage会将消息进行翻译,主要是把虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。Windows中每一个键盘按键,都对应了一个宏,这个键盘按键发出的消息就是虚拟键消息。TranslateMessage的作用就是将虚拟键消息转成字符消息WM_CHAR、WM_SYSCHAR等等。

三、消息处理

DispatchMessage的作用就是将消息,分派到我们实现定义好的窗口处理函数中进行处理,下面是我们在之前的文章中定义的窗口处理函数:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
	switch (uMsg)  
	{  
	case WM_DESTROY:  
		PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0  
		break;  
	default:  
		break;  
	}  
	return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}
Salin selepas log masuk


hWnd就是产生消息的窗口句柄,uMsg是传递的消息,wParam和lParam分别是消息携带的两个参数。在上面的窗口处理函数中,我们定只处理了一个消息WM_DESTROY,这是我们在点击窗口的关闭按钮后产生的一个消息。我们说过,我们在创建窗口是,也会产生一个WM_CREATE消息。下面我们在窗口处理函数中处理这个消息:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
	switch (uMsg)  
	{  
	case WM_DESTROY:  
		PostQuitMessage(0);//可¨¦以°?使º1GetMessage返¤¦Ì回?0  
		break; 
	case  WM_CREATE:
		MessageBox(NULL,"WM_CREATE消息被处理了","消息处理",MB_OK);
	default:  
		break;  
	}  
	return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}
Salin selepas log masuk


        我们在接受到WM_CREATE后,会弹出一个对话框。预期的效果是点击这个对话框的确定按钮后才会显示窗口。如下面所示:

        运行程序,先弹出对话框:


        点击确定按钮后,弹出窗口:


Atas ialah kandungan terperinci Win32 SDK基础(八)之 关于Windows消息机制的详解(图). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Windows 11 22H2 membawa reka bentuk mika/akrilik kepada lebih banyak apl desktop Win32 Windows 11 22H2 membawa reka bentuk mika/akrilik kepada lebih banyak apl desktop Win32 Apr 14, 2023 pm 04:58 PM

Apl asli Windows 11 (seperti File Explorer) dan apl cangkerang lain menggunakan penjuru bulat dan elemen Reka Bentuk Fasih (seperti Akrilik) secara lalai. Selain sudut bulat, satu lagi ciri reka bentuk penting Windows 11 ialah bahan seperti mika, yang menjajarkan warna latar belakang aplikasi dengan desktop. Mika serupa dengan akrilik tetapi berfungsi sedikit berbeza. Seperti yang diterangkan oleh Microsoft, Bahan Windows Mica mencipta "hierarki warna dengan menjajarkan latar belakang dengan aplikasi

Microsoft sedang membangunkan kesan kabur baharu untuk Windows 11 Microsoft sedang membangunkan kesan kabur baharu untuk Windows 11 May 13, 2023 am 09:04 AM

Windows 11 SDK baharu untuk binaan 22523 mendedahkan bahawa Microsoft sedang membangunkan kesan kabur baharu untuk Windows 11. Kesan ini dipanggil Tabbed, dan merupakan tambahan kepada Akrilik dan Mika. DWMWA_SYSTEMBACKDROP_TYPE baharu dalam SDK 22523, API Win32 awam untuk Mica, Acrylic dan campuran "tab" baharu mereka yang pelik: pic.twitter.com/dbsu7ZFiIi — It's All Back (@StartIsBack) 15 Disember 2021 Tersedia dalam SDK berikut Contoh permohonan

Trojan/win32.casdet Rfn dalam Windows 11 Trojan/win32.casdet Rfn dalam Windows 11 Apr 14, 2023 pm 02:49 PM

Perisian antivirus kadangkala boleh memaparkan amaran yang menyatakan Trojan/win11.casdet rfn pada komputer riba Windows 32. Ia menunjukkan bahawa PC dijangkiti malware Trojan, menyebabkan ia tidak berfungsi. Nasib baik, terdapat beberapa cara yang mungkin untuk menyelesaikan masalah ini, seperti yang dijelaskan di bawah. Selain itu, anda mungkin berminat dengan panduan terperinci kami tentang sama ada cdn.districtm.io ialah pop timbul/virus/perisian hasad atau tidak. Apakah Trojan/win32.casdet rfn? Trojan/win32.casdet rfn ialah jangkitan virus Trojan yang teruk yang boleh mengatasi sistem dan membunuh prosesnya, menjadikannya mudah

Apakah perbezaan antara win32 dan win64 Apakah perbezaan antara win32 dan win64 May 29, 2023 pm 05:22 PM

Perbezaan antara win32 dan win64 ialah: 1. win32 merujuk kepada persekitaran 32-bit sistem pengendalian Microsoft Windows, dan win64 merujuk kepada versi 64-bit sistem pengendalian Microsoft Windows, yang lebih stabil dan lebih pantas daripada 32 -versi bit; 2. win32 menyokong sehingga 2G memori, win64 mesti mempunyai lebih daripada 4G memori;

Microsoft mula menguji reka bentuk OneNote baharu untuk Windows 11 Microsoft mula menguji reka bentuk OneNote baharu untuk Windows 11 Apr 19, 2023 pm 08:01 PM

Kembali pada Ogos 2021, Microsoft berjanji bahawa OneNote pada Windows 10 dan Windows 11 akan menerima satu siri kemas kini ciri utama dalam beberapa bulan akan datang, kerana gergasi teknologi itu menyatukan berbilang versi aplikasi pengambilan nota menjadi satu bahagian daripada pelanggan. OneNote telah mengalami banyak perubahan sejak beberapa tahun yang lalu. Pada tahun 2018, apabila Microsoft benar-benar mahu orang ramai menggunakan versi UWP OneNote, syarikat itu berhenti menggabungkan versi asal dan kaya ciri OneNote dengan aplikasi Office yang diprapasang. Sebaliknya, Microsoft hanya menyediakan klien UWP dan menambah ciri baharu untuk versi moden. Microsoft kemudiannya berubah

Kuasai kemahiran penting untuk pembangunan menengah Java Hikvision SDK Kuasai kemahiran penting untuk pembangunan menengah Java Hikvision SDK Sep 06, 2023 am 08:10 AM

Kuasai kemahiran penting untuk pembangunan menengah Java Hikvision SDK Pengenalan: Dengan perkembangan pesat teknologi maklumat, sistem pengawasan video telah digunakan secara meluas dalam pelbagai bidang. Sebagai penyedia penyelesaian pengawasan video domestik yang terkemuka, produk dan teknologi Hikvision sentiasa menduduki kedudukan penting dalam pasaran. Untuk memenuhi keperluan projek yang berbeza, Hikvision menyediakan SDK untuk pemaju menjalankan pembangunan sekunder. Artikel ini akan memperkenalkan beberapa kemahiran penting untuk menguasai pembangunan sekunder Java Hikvision SDK, dan melampirkan contoh kod yang sepadan. 1. Fahami Hikvision

Windows App SDK 1.2 kini dalam talian, inilah perkara baharu Windows App SDK 1.2 kini dalam talian, inilah perkara baharu May 12, 2023 pm 06:07 PM

WindowsAppSDK ialah satu set alat dan API yang boleh digunakan oleh pembangun dalam aplikasi Windows mereka untuk menyediakan kefungsian "konsisten" merentas pelbagai peranti menggunakan Windows 10 (versi 1809 dan lebih baru) dan Windows 11. Sangat penting untuk memahami bahawa ia tidak menggantikan jenis aplikasi sedia ada seperti .NET atau Windows SDK, ia hanya menyediakan set alat API bersatu yang boleh digunakan untuk melengkapkan aplikasi sedia ada anda. Hari ini, Microsoft mengeluarkan versi 1.2 Windows App SDK dengan banyak ciri baharu. Sorotan keluaran ini mungkin pembangun pihak ketiga

apa itu sdk apa itu sdk Jan 06, 2023 pm 03:26 PM

Nama penuh sdk ialah "Kit Pembangunan Perisian", yang bermaksud "kit pembangunan perisian" dalam bahasa Cina Ia adalah satu set alat yang disediakan oleh pengilang platform perkakasan, sistem pengendalian (OS) atau bahasa pengaturcaraan. SDK membantu pembangun perisian dalam mencipta aplikasi untuk platform, sistem atau bahasa pengaturcaraan tertentu. SDK asas biasanya terdiri daripada pengkompil, penyahpepijat dan antara muka pengaturcaraan aplikasi (API), tetapi mungkin juga termasuk kandungan lain, seperti: dokumentasi, perpustakaan, persekitaran masa jalan/pembangunan, alat ujian/analisis, protokol rangkaian, dsb.

See all articles