C#發(fā)送消息方法簡(jiǎn)析
C#發(fā)送消息功能的實(shí)現(xiàn)是如何的呢?最近想模擬一下鍵盤(pán)按鍵,以便作一個(gè)游戲外掛.就試著用C#實(shí)現(xiàn)此功能那么這里向你介紹具體的實(shí)現(xiàn)過(guò)程,希望那個(gè)對(duì)你有個(gè)參考的作用。
C#發(fā)送消息功能的內(nèi)涵方法:
C#中有一個(gè)Message結(jié)構(gòu),該結(jié)構(gòu)中有一個(gè)函數(shù)Create()可以用來(lái)創(chuàng)建消息.原型如下:
- public static Message Create(
- IntPtr hwnd,//接收消息的窗口句柄
- int msg, //消息 的ID,也就是一個(gè)uint
- IntPtr wparam,// 消息的Wparam域
- IntPtr lparam //消息的Lparam域
- }
比如我們要發(fā)送一個(gè)字符串到記事本:
- string text ="范俊武搞的一個(gè)窗口消息測(cè)試!";//
- char[] chars = text.ToCharArray();//轉(zhuǎn)換成數(shù)組
- foreach (char item in chars)
- {
- Message msg = Message.Create(hWnd, WM_CHAR,
- new IntPtr(item), IntPtr.Zero);
- //創(chuàng)建一個(gè)WM_CHAR消息.一會(huì)說(shuō)這里邊的參數(shù)是怎么一回事
- MessageAPI.PostMessage(msg.HWnd, msg.Msg,
- msg.WParam, msg.LParam);//調(diào)用Win32API函數(shù) ,
- //關(guān)于這個(gè)函數(shù)在C#中的聲明我就不寫(xiě)了網(wǎng)上有很多關(guān)于C#中平臺(tái)調(diào)用的講解.
- }
C#發(fā)送消息之WM_CHAR介紹,它是Windows中的一個(gè)消息. MSDN是這樣定義的:
The WM_CHAR message is posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function. The WM_CHAR message contains the character code of the key that was pressed.
我粘貼過(guò)來(lái),大家看下,我英語(yǔ)不是很好,翻譯不過(guò)來(lái),不過(guò)我可以看明白是咋地一回事!大致是這個(gè)意思.當(dāng)我們按下一個(gè)鍵的時(shí)候,產(chǎn)生一個(gè)WM_KEYDOWN 然后呢,這個(gè)消息被一個(gè)TranslateMessage 函數(shù)翻譯成WM_CHAR消息.顯然WM_CHAR消息攜帶了一個(gè)字符,比方說(shuō)我們按了個(gè)字母"A"鍵,WM_CHAR就攜帶了"a" 這個(gè)character.
另外Create函數(shù)的第二個(gè)參數(shù)是Int型的.我們可以在Windows.h中看到WM_CHAR其實(shí)是一個(gè)常量:0x0102,一個(gè)十六進(jìn)制數(shù).WM_CHAR的ID號(hào).代表WM_CHAR消息.
所以第二個(gè)參數(shù)是這么來(lái)的:
- const int WM_CHAR = 0x0102;
WM_CHAR的消息中 wParam 是這么定義的,又是一段英文:Specifies the character code of the key. 就是一個(gè)按鍵的字符.
WM_CHAR的消息中 lParam ,這個(gè)參數(shù)比較復(fù)雜,是一個(gè)32位數(shù),每一位都有定義.不過(guò)這個(gè)參數(shù)經(jīng)常被設(shè)置成0.
那么hWnd從哪里來(lái)的呢,就是我們要發(fā)送消息到記事本窗口的句柄.這個(gè)句柄也是一個(gè)32位值.我們可以調(diào)用Win32API函數(shù)
- string className = "Notepad";
- string captionName = "無(wú)標(biāo)題 - 記事本"; //可以通過(guò)SPY++了解到.
- IntPtr hWnd=FindWindow(className ,captionName);//找主窗口.
- hWnd = FindWindowEx(hWnd, IntPtr.Zero, "Edit", "");找主窗口中的Edit窗口.
PostMessage 就是發(fā)送消息了,各個(gè)參數(shù)都是在我們創(chuàng)建的消息Msg中包含的.挺簡(jiǎn)單的.
至于wParam和lParam 不同的消息 會(huì)有不同的定義,我們想發(fā)送什么消息,就去MSDN中關(guān)于這個(gè)消息的定義,可以了解到wParam和lParam 的意義!
C#發(fā)送消息功能的基本內(nèi)容就向你介紹到這里,希望那個(gè)對(duì)你了解和學(xué)習(xí)C#發(fā)送消息功能有所幫助。
【編輯推薦】