1. 程式人生 > >C#應用WindowsApi實現查詢\列舉(FindWindow、EnumChildWindows)窗體控制元件,併發送訊息。

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實現查詢\列(FindWindowEnumChildWindows)窗體控制元件併發訊息

轉載: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語句實現查詢成績-6060~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# 使用程式碼實現非託管dllOCX動態註冊

一般我們註冊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 在 buttontextview等控制元件按下和選中的時候改變顏色或圖片實現方法

首先,在res資料夾下新建一個資料夾drawable,這是無關解析度的: 在下面建立一個xml檔案:select.xml 方法1 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android

C# Chart控制元件chartSeriesChartArea曲線圖繪製的重要屬性

迴圈設定  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,隨便點選一個,都可