C#類比滑鼠鍵盤控制其他視窗(一)

來源:互聯網
上載者:User

標籤:style   blog   os   ar   sp   檔案   on   問題   log   

     編寫程式類比滑鼠和鍵盤操作可以方便的實現你需要的功能,而不需要對方程式為你開放介面。比如,操作飛信定時傳送簡訊等。我之前開發過飛信耗子,用的是對飛信協議進行抓包,然後分析協議,進而類比協議的執行,開發出了用戶端,與行動服務器進行通訊,但是這有一些缺點。如果移動的伺服器對介面進行變更,我所編寫的用戶端也要進行相應的升級。如果伺服器的協議進行了更改,甚至個人編寫的這種第三方用戶端需要重寫。而我個人也沒有這個時間和精力,或者說沒有足夠的利益支撐我繼續去重構飛信耗子。因此,這款還算優秀的軟體,現在就束之高閣了,我自己也覺得遺憾。上周,某項目驗收,需要修改介面,但是零時找不到源碼了。我在兩三個小時內要解決這個問題,時間緊迫。我突然想起室友以前做過類比滑鼠鍵盤去發送飛信訊息的小程式。於是我趕緊電話諮詢了一下。然後掌握了這個技巧,按時解決了問題。我覺得這個技巧還是很有用的,現總結如下:
首先,引入如下三個API介面:
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

[DllImport("User32.dll ")]
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string FrmText);
第一個與第三個是用於尋找視窗控制代碼的,凡運行於Windows上的視窗,都具有控制代碼。視窗上的文字框,按鈕之類的,也有其控制代碼(可看作子視窗控制代碼)。這些控制代碼的類型可以通過Spy++進行查詢。比如C語言編寫的程式中,文字框的控制代碼類型一般為“EDIT”,C#寫的程式則不是,可以具體去查。第二個介面則是用於向視窗發送各種訊息,比如向文字框發送字串,或者向按鈕發送按下與彈起的訊息等。詳細解釋如下:
IntPtr hwnd = FindWindow(null, "無標題 - 記事本");這是用於尋找作業系統中開啟的視窗中標題名為無標題 - 記事本的視窗。第一個參數是此視窗的類型。這兩個參數知道一個即可,另一個可以填null。但是如果是用視窗類別型尋找,則可能只能得到其中的一個視窗。因此通過標題進行尋找是非常方便的。
IntPtr htextbox = FindWindowEx(hwnd, IntPtr.Zero, "EDIT", null);
這個函數用於獲得視窗中子視窗的控制代碼,子視窗指的其實就是視窗中的各種控制項。第一個參數是父視窗的控制代碼,第二個參數指示獲得的是同一類型中的第幾個子視窗。填IntPtr.Zero則表示獲得第一個子視窗。第三個參數表示你需要找的子視窗的類型,第四個參數一般為null。如果一個視窗中有兩個文字框,那麼可以用如下操作獲得第二個文字框的控制代碼。
IntPtr htextbox = FindWindowEx(hwnd, IntPtr.Zero, "EDIT", null);
IntPtr htextbox2 = FindWindowEx(hwnd, htextbox, "EDIT", null);//填上次獲得的控制代碼,可以得到下一個的控制代碼。
這裡只是先將第二個參數填為IntPtr.Zero,擷取第一個EDIT類型的文字框,然後第二次調用時,再將第二參數填為第一個文字框的控制代碼,那麼執行返回的就是下一個文字框的控制代碼了。因此htextbox2得到的就是第二文字框的控制代碼。
在可以自由獲得各種視窗及其上控制項的控制代碼後,我們就可以向其發送各種訊息進行滑鼠和鍵盤的類比了。比如:
SendMessage(htextbox, WM_SETTEXT, IntPtr.Zero, name);
這句是為文字框填寫相應的字串name。
IntPtr hbutton = FindWindowEx(hwnd, IntPtr.Zero, "BUTTON", null);
SendMessage(hbutton, WM_LBUTTONDOWN, IntPtr.Zero, null);
SendMessage(hbutton, WM_LBUTTONUP, IntPtr.Zero, null);
這三句是獲得了視窗的一個button,然後發送按下,彈起訊息給它,類比了點擊滑鼠的動作。
SendMessage函數的第一個參數是視窗控制代碼,或者視窗中控制項的控制代碼,第二個參數是訊息的類型Flag,這些值是在API的一些標頭檔中定義好的。你要是在C#中用,就自己去定義他們,比如
const int WM_SETTEXT = 0x000C;
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;
const int WM_CLOSE = 0x0010;
還有其他的類型Flag,可以參考上一篇Blog查詢,也可以去查MSDN。第三個參數和第四個參數都是訊息的具體內容。一般我們用的是最後一個參數。第三個參數填為IntPtr.Zero。當然如果是滑鼠的動作,那麼最後一個參數就是null。
SendMessage(htextbox, WM_SETTEXT, IntPtr.Zero, name);//填寫文字框。
SendMessage(hbutton, WM_LBUTTONDOWN, IntPtr.Zero, null);//滑鼠按下按鈕。
OK,介紹完畢,收工。

C#類比滑鼠鍵盤控制其他視窗(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.