
哈羅大家好,我是你們最喜歡的蒟蒻君~
從今天開始,蒟蒻君要和大家一起學習C++黑客啦!!
注:代碼在DEV-C++這些針對演算法編程的編譯器上是編譯不了的,需要用vscode或者vc才行,
文章目錄
- 簡介:訊息機制?
- 訊息機制是哈?
- 訊息是怎么生成噠?
- 如何表示一個訊息?
- 初探API函式(FindWindow和SendMessage函式)
- FindWindow
- SendMessage
- 除錯訊息機制:查看記事本屬性
簡介:訊息機制?
訊息機制是哈?
Windows中應用是基于訊息機制噠~ 訊息,就是系統生成的一個32位(相當于int型別)的值,這個值就想系統說明了一個事件 (不會重復),比如用戶點了一下滑鼠,敲了一下鍵盤,或者拖動了一下視窗,這些都會報告給Windows,

了解完什么是Windows的訊息機制,大家可能會想:Windows是怎么生成這樣的一個數呢?一個操作有那么多屬性,又怎么能保證任意兩個訊息均不相同呢?
訊息是怎么生成噠?
相信句柄(HWND)大家都吉島,布吉島的小伙伴可以看這篇文章,
先看看訊息在windows中的定義叭(訊息就是MSG哦)~
struct tagMsg {
HWND hwnd; // 視窗句柄
UINT message; // 訊息的值
WPARAM wParam; // 用于保證訊息各不相同的東東
LPARAM lParam; // 同上一個
DWORD time; // 這個訊息是什么時候創建的
POINT pt; // 創建訊息的時候游標在哪里(坐標)
} MSG;
小伙伴們懂了叭~
一個小小的訊息也是包含了很多屬性,所以不可能有兩個訊息相同啦~~
如何表示一個訊息?

真正有用的訊息值在0x0000在0x03ff之間(0x就是用16進制表示),而且,程式不能用這些訊息指值給自己的訊息(這些都是系統要用的),
應用程式用的訊息是從0x0400到0x7fff,或者從0xc000到0xffff的(電腦不一樣這個就不一樣),
下一步,我們要認識一些訊息型別(看不懂可以忽略),
| 訊息型別 | 值的范圍 |
|---|---|
| 空噠 | WM_NULL到0x0000 |
| 關于 | 0x0001至0x0087 |
| 系統 | 0x00A0至0x00A9 |
| 鍵盤 | 0x0100至0x0108 |
| 選單 | 0x0111至0x0126 |
| 顏色控制 | 0x0132至0x0138 |
| 滑鼠 | 0x0200至0x020A |
| 選單回圈 | 0x0211至0x0213 |
| 多檔案 | 0x0220至0x0230 |
| 決策系統 | 0x0400 |
| 客戶端 | 0x8000 |
| 應用自定義 | 0x0400至0x7FFF |
好啦~大功告成!作為一個小白白 (大佬忽略),我們就先認識這些關于訊息的東東叭,剩下的以后就會學到,
初探API函式(FindWindow和SendMessage函式)
API函式就是介面函式,為了方便我們撰寫介面公開的,
那么我們的第一個黑客程式需要用到什么函式呢?
Let’s go~~
FindWindow
作用:
通過視窗名找到視窗句柄,
定義:
LPCSTR = const TCHAR*
HWND FindWindow(
LPCTSTR lpClassName, // 視窗類的名稱
LPCTSTR lpWindowsName // 視窗的名稱(視窗標題)
);
程式中的運用:
在代碼里面,因為視窗的名稱會改變(這里我們寫了一個編輯視窗標題的函式edit),所以只能用視窗類名來找句柄啦~
SendMessage
作用:
通過句柄確定視窗,然后將訊息發過去,
定義:
UINT = unsigned int
WPARAM = UINT
LPARAM = LONG
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
};
補充:幾個訊息的具體含義
WM_CLOSE:拿到這個訊息的視窗必須關閉(最后兩個引數莫有用處,為NULL)
WM_SETTEXT:拿到這個訊息的視窗必須設定下里面的文字(不用用wParam,lParam指向結尾為NULL的文本)
WM_GETTEXT:拿到這個訊息的視窗里面的文本會被copy下來(wParam是要復制前多少個字符,lParam是復制到哪里)

除錯訊息機制:查看記事本屬性
#include <Windows.h>
// 獲取記事本標題
void get_name() {
HWND h = ::FindWindow(L"Notepad", NULL);
if (h == NULL) {
MessageBox(NULL, L"莫有記事本哦~", L"蒟蒻君提示", MB_OK);
return;
}
char s[MAXBYTE] = {0};
::SendMessage(h, WM_SETTEXT, (WPARAM)0, (LPARAM)s);
MessageBox(NULL, (LPCWSTR)s, L"蒟蒻君提示", MB_OK);
}
// 編輯記事本標題
void edit() {
HWND h = ::FindWindow(NULL, L"無標題 - 記事本");
if (h == NULL) {
MessageBox(NULL, L"莫有記事本哦~", L"蒟蒻君提示", MB_OK);
return;
}
::SendMessage(h, WM_SETTEXT, (WPARAM)0, (LPARAM)"除錯");
}
// 運行記事本
void run() {
WinExec("notepad.exe", SW_SHOW);
}
// 關閉記事本
void close() {
HWND h = ::FindWindow(L"Notepad", NULL);
if (h == NULL) {
MessageBox(NULL, L"莫有記事本哦~", L"蒟蒻君提示", MB_OK);
return;
}
::SendMessage(h, WM_CLOSE, NULL, NULL);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302509.html
標籤:其他
上一篇:軟體測驗基礎——非功能測驗入門
下一篇:gin-vue-blog自建博客
