Windows消息机制学习笔记(二)—— 窗口与线程
生活随笔
收集整理的這篇文章主要介紹了
Windows消息机制学习笔记(二)—— 窗口与线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows消息機制學習筆記(二)—— 窗口與線程
- 要點回顧
- 消息從哪里來?
- 實驗一:Spy++捕獲消息
- 實驗二:消息捕獲
- 消息到哪里去?
- 窗口在哪?
- 實驗:分析CreateWindowExW
- 窗口對象
- 總結
要點回顧
一個GUI線程對應一個消息隊列
本篇要解決的問題:
消息從哪里來?
1)Spy++ 捕捉消息:鼠標消息、鍵盤消息
2)程序發送消息
實驗一:Spy++捕獲消息
1)編譯并運行以下代碼
#include <windows.h>LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParam,IN LPARAM lParam ){return DefWindowProc(hwnd, uMsg, wParam, lParam); }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd ){//窗口的類名TCHAR className[] = "My First Window";//創建一個自己的窗口WNDCLASS wndclass = {0};wndclass.hbrBackground = (HBRUSH)COLOR_MENU;wndclass.lpfnWndProc = WindowProc;wndclass.lpszClassName = className;wndclass.hInstance = hInstance;//注冊RegisterClass(&wndclass);//創建窗口HWND hwnd = CreateWindow(className,TEXT("我的第一個窗口"),WS_OVERLAPPEDWINDOW,10,10,600,300,NULL,NULL,hInstance,NULL);if(hwnd == NULL)return 0;//顯示窗口ShowWindow(hwnd, SW_SHOW);//消息循環MSG msg;while(GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0; }運行結果
2)使用spy++定位窗口
3)在窗口中進行任意操作,例如鼠標移動,鼠標點擊,鍵盤敲擊等,觀察消息列表
實驗二:消息捕獲
1)進程A運行以下代碼
#include <windows.h>LRESULT CALLBACK WindowProc(IN HWND hwnd,IN UINT uMsg,IN WPARAM wParam,IN LPARAM lParam ){switch(uMsg){case 0x401:MessageBoxA(NULL, "接收到消息", "新消息", MB_OK);return false;}return DefWindowProc(hwnd, uMsg, wParam, lParam); }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd ){//窗口的類名TCHAR className[] = "My First Window";//創建一個自己的窗口WNDCLASS wndclass = {0};wndclass.hbrBackground = (HBRUSH)COLOR_MENU;wndclass.lpfnWndProc = WindowProc;wndclass.lpszClassName = className;wndclass.hInstance = hInstance;//注冊RegisterClass(&wndclass);//創建窗口HWND hwnd = CreateWindow(className,TEXT("我的第一個窗口"),WS_OVERLAPPEDWINDOW,10,10,600,300,NULL,NULL,hInstance,NULL);if(hwnd == NULL)return 0;//顯示窗口ShowWindow(hwnd, SW_SHOW);//消息循環MSG msg;while(GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0; }2)進程B運行以下代碼
#include <stdio.h> #include <windows.h>int main() {HWND hwnd = FindWindow("My First Window", "我的第一個窗口");SendMessage(hwnd, 0x401, 0, 0);return 0; }執行結果
消息到哪里去?
描述:
當初始化w32k.sys這個模塊時,會調用一個叫做InitInputImpl的函數
這個函數會啟動兩個線程,分別用來監控鼠標和鍵盤,這兩個線程都是0環的線程
平時我們的電腦遭遇“死機”時,常常是屏幕動不了,鼠標還能動,這正式由于鼠標是有一個獨立的線程在監控它的行動
思考:w32k.sys如何區分用戶點擊的是哪個窗口/消息要去哪個線程
窗口在哪?
當調用CreateWindow時,該函數實際上是一個宏,其CreateWindowA實際對應CreateWindowExA函數,CreateWindowW對應CreateWindowExW函數,可在編輯器中跟蹤觀察
實驗:分析CreateWindowExW
函數位于user32.dll中
總結:窗口在0環被畫出(由w32k.sys實現)
窗口對象
描述:
消息進入窗口消息隊列的過程:
注意:在3環得到的窗口的句柄只是一個索引(參考句柄表章節)
總結
總結
以上是生活随笔為你收集整理的Windows消息机制学习笔记(二)—— 窗口与线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows消息机制学习笔记(一)——
- 下一篇: 恶意代码分析(一)