C#應用WindowsApi實現查詢\列舉(FindWindow、EnumChildWindows)窗體控制元件,併發送訊息。
轉載:http://www.cnblogs.com/hehexiaoxia/p/4223927.html
首先介紹基本WindowsApi:
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
函式說明:在視窗列表中尋找與指定條件相符的第一個視窗
匯入庫:user32.lib
標頭檔案:winuser.h
名稱空間 using System.Runtime.InteropServices;
引數說明
lpClassName String,視窗類名
lpWindowName String,視窗標題
返回值:視窗控制代碼
public static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);
函式說明:在視窗列表中尋找與指定條件相符的第一個子視窗
匯入庫:user32.lib
標頭檔案:winuser.h
名稱空間 using System.Runtime.InteropServices;
引數說明
hwndParent IntPtr ,父視窗控制代碼,如果hwndParent為 0 ,則函式以桌面視窗為父視窗,查詢桌面視窗的所有子視窗。
hwndChildAfter IntPtr ,子視窗控制代碼,查詢從在Z序中的下一個子視窗開始。子視窗必須為hwndParent視窗的直接子視窗而非後代視窗。如果HwndChildAfter為NULL,查詢從hwndParent的第一個子視窗開始。如果hwndParent 和 hwndChildAfter同時為NULL,則函式查詢所有的頂層視窗及訊息視窗。
lpszClass string ,控制元件類名
lpszWindow string ,控制元件標題,如果該引數為 NULL,則為所有視窗全匹配。
返回值:控制元件控制代碼。
public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
函式功能:列舉一個父視窗的所有子視窗。
匯入庫:user32.lib
標頭檔案:winuser.h
名稱空間 using System.Runtime.InteropServices;
引數說明
hWndParent IntPtr 父視窗控制代碼
lpfn CallBack 回撥函式的地址
lParam int 自定義的引數
注意:回撥函式的返回值將會影響到這個API函式的行為。如果回撥函式返回true,則列舉繼續直到列舉完成;如果返回false,則將會中止列舉。
其中CallBack是這樣的一個委託:public delegate bool CallBack(IntPtr hwnd, int lParam); 如果 CallBack 返回的是true,則會繼續列舉,否則就會終止列舉。
應用例項:
用到的WindowApi類
static class WindowsApi { [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam); [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)] public static extern void SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll")] public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam); public delegate bool CallBack(IntPtr hwnd, int lParam); } class Program { /// <summary> /// 查詢窗體上控制元件控制代碼 /// </summary> /// <param name="hwnd">父窗體控制代碼</param> /// <param name="lpszWindow">控制元件標題(Text)</param> /// <param name="bChild">設定是否在子窗體中查詢</param> /// <returns>控制元件控制代碼,沒找到返回IntPtr.Zero</returns> private IntPtr FindWindowEx(IntPtr hwnd, string lpszWindow, bool bChild) { IntPtr iResult = IntPtr.Zero; // 首先在父窗體上查詢控制元件 iResult = WindowsApi.FindWindowEx(hwnd, 0, null, lpszWindow); // 如果找到直接返回控制元件控制代碼 if (iResult != IntPtr.Zero) return iResult; // 如果設定了不在子窗體中查詢 if (!bChild) return iResult; // 列舉子窗體,查詢控制元件控制代碼 int i = WindowsApi.EnumChildWindows( hwnd, (h, l) => { IntPtr f1 = WindowsApi.FindWindowEx(h, 0, null, lpszWindow); if (f1 == IntPtr.Zero) return true; else { iResult = f1; return false; } }, 0); // 返回查詢結果 return iResult; } private void OnRunClick(object sender, EventArgs e) { // 查詢主介面控制代碼 IntPtr mainHandle = WindowsApi.FindWindow(null, "主介面(Ver:3.1.3.47)"); if (mainHandle != IntPtr.Zero) { // 查詢按鈕控制代碼 IntPtr iBt = FindWindowEx(mainHandle, "現(F1)", true); if (iBt != IntPtr.Zero) // 傳送單擊訊息 WindowsApi.SendMessage(iBt, 0xF5, 0, 0); } } }
應用工具:
這裡可以應用spy工具來檢視視窗的控制代碼、標題、型別等資訊,非常方便。
相關推薦
C#應用WindowsApi實現查詢\列舉(FindWindow、EnumChildWindows)窗體控制元件,併發送訊息。
轉載:http://www.cnblogs.com/hehexiaoxia/p/4223927.html 首先介紹基本WindowsApi: public static extern IntPtr FindWindow(string lpClassName, strin
C#自定義類中操作主窗體控制元件,通過委託實現
主窗體中包含一個標籤label1和一個按鈕button1 程式碼如下: public void ChangeLabel(string text) { label1.Text = text; } private void button1_Click(o
java網路程式設計實現客戶端連線伺服器端,併發送訊息例子(1)。(阻塞式的方法)
昨天晚上學了網路執行緒,並寫了一個,客戶端連線伺服器的簡單例子,有點QQ的感覺,但是實際上還差遠,差不多就是很久之前那種“長江長江我是黃河”的通話形式。 程式碼如下: 伺服器端程式碼: imp
C#應用BindingSource實現數據同步的方法
som namespace tin 分享 add art creat line erb 本文以實例形式講述了C#應用BindingSource實現數據同步的方法,對C#數據庫程序開發來說具有一定的參考借鑒價值。具體實現方法如下: 下面的代碼示例演示如何使用 Binding
一條SQL語句實現查詢成績-60、60~80、+80的人數的方法
總結一下學到的一個SQL方法。下面我建立一個數據表: SELECT * FROM students; 可以看到資料表中存在六條資料,如果使用傳統的查詢方法,我們需要三條SQL語句,分別是: select count(*) from students where score<6
C程式設計——程式設計實現查詢兩個字串的最大公共子串2.0
1、 題目:程式設計實現查詢兩個字串的最大公共子串 示例:“aocdfe"和"pmcdfa"最大公共子串為"cdf” 注:最大公共子串有不止一個時,只輸出第一個最大子串 利用斐波那契數列數的思想 **2、**程式 #include <stdio.h> #include &
C程式設計——程式設計實現查詢兩個字串的最大公共子串1.0
1、 題目:程式設計實現查詢兩個字串的最大公共子串 示例:“aocdfe"和"pmcdfa"最大公共子串為"cdf” 注:最大公共子串有不止一個時,只輸出第一個最大子串 **2、**程式 #include <stdio.h> #include <string.h>
C# 使用程式碼實現非託管dll、OCX動態註冊
一般我們註冊VB的ocx控制元件或者其他的dll需要手動在控制檯命令中用regsvr32來註冊,其實就是呼叫dll中的DllRegisterServer方法,用c#的DllImport也可以呼叫該方法,
C++遞迴實現十進位制轉二進位制、八進位制、十六進位制
1.轉二進位制與八進位制分析 我們最熟悉不過的就是短除法將十進位制轉二進位制,將餘數倒著輸出便是該是十進位制的二進位制數,那麼很容易想到拿十進位制數n%2(或者8)這樣可以得到最高位的二進位制(八
獲取iframe中的內容、查詢獲取指定元素(關於用c++呼叫WEBBROWSER控制元件,使用相關介面操作web頁面元素的一些方法)
最近開發WINDOWS下的應用程式,需要用到C++中呼叫WEBBROWSER控制元件操作網頁的相關技術,查閱了一下相關文件,反覆除錯了幾天,對其中的技術有了一些膚淺的認識,大多數C++程式設計師對COM應該不陌生,其實用C++操作網頁,在前端應用層上主要就是對COM介面的查
一個Android文字輪播控制元件,實現了可垂直跑、可水平跑的跑馬燈
Android文字輪播控制元件 現在的絕大數APP特別是類似淘寶京東等這些大型APP都有文字輪播介面,實現迴圈輪播多個廣告詞等功能;這種控制元件俗稱“跑馬燈”,而TextBannerView已經實現了可垂直跑、可水平跑的跑馬燈了。 效果圖 Attribute
android 新聞應用、Xposed模組、酷炫的載入動畫、下載模組、九宮格控制元件等原始碼
Android精選原始碼 靈活的ShadowView,可替代CardView使用 基於Tesseract-OCR實現自動掃描識別手機號 Android播放介面仿QQ音樂開源音樂播放器 新聞應用專案採用了 RxAndroid + Retrofit + Databinding 的 MVVM 架
C#應用程式設計小例子-03-展示另一個窗體
C#應用程式設計小例子-03-展示另一個窗體 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing
習題9:設計一個Windows應用程式,窗體上有一個TextBox控制元件、一個Button控制元件。
設計一個Windows應用程式,窗體上有一個TextBox控制元件、一個Button控制元件。要求,每當使用者單擊按鈕時,文字框都會增加一行文字來反映單擊的次數,例如“第3次單擊按鈕”。 【解答】 1) 窗體介面如圖Ex5-5-1所示; 2) 窗體中主要控制元件屬性設
基於應用寶實現微信h5頁面中開啟本地app,如果沒有跳轉下載頁面的解決方案
首先這個方法是基於微信中開啟的h5頁面的,如果是外接瀏覽器的話則無論是否有該app都會執行下載 <a href="http://d.xiaojukeji.com/c/73852">
android 在 button、textview等控制元件按下和選中的時候改變顏色或圖片實現方法
首先,在res資料夾下新建一個資料夾drawable,這是無關解析度的: 在下面建立一個xml檔案:select.xml 方法1 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android
C# Chart控制元件,chart、Series、ChartArea曲線圖繪製的重要屬性
迴圈設定 chart1.Series[0].Points[i].ToolTip = “” ; 可以通過 i 定位到 Dt中的資料直接設定 chart1.Series[0].ToolTip =""; 只能設定Xy軸的值。8個月沒寫部落格了- -,一來是有不想繼續幹開發的
對集合控制元件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查詢、替換操作控制元件
一、程式入口:using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;namespace HR.Control{ /// <summary
c#如何保持控制元件位置與窗體同比例?C#實現窗體控制元件隨窗體大小改變(包括字型大小)
可以通過Dock屬性和Anchor屬性來控制 設定控制元件的 Anchor屬性 如果要隨著窗體變化而變化 則設定為Top, Bottom, Left, Right 當然也可以只設定期中幾個值 左邊的設定TOP,LEFT,中間設NONE,右邊的設right,bottom
Unity3D自帶案例AngryBots分析(三)——怪物啟用、攻擊、動作邏輯控制分析,第一個怪物KamikazeBuzzer的攻擊特效的實現原理
從Hierarchy檢視中可以看見,Enemies物件下面掛有很多子物件,很多都是Prefab。而點選這些子物件,其實發現它們的很多地方有很大的相同之處,就拿SimpleBuzzers來看,裡面的怪物KamikazeBuzzer都是相同的怪物Prefab,隨便點選一個,都可