天天看點

c#如何跳出一個函數_C# 句柄擷取子產品

c#如何跳出一個函數_C# 句柄擷取子產品

前言

最近整一個項目,它需要能自動操縱裝置軟體上的某些按鈕,來得到我們所期待的裝置控制要求。

這樣類似的功能,通常都是需要通過擷取句柄的方式,然後發送Message來實作。以前我都是用VB6.0來實作,那是一個很老的程式設計環境,微軟也不維護它了。還好,現在有了更為強大和滿是甜糖的C#,于是怎樣用C#來實作句柄的擷取,成了很有趣的探讨内容。

句柄擷取的方法,在網絡上能搜到很多很多介紹,這裡我介紹下我整合的一個句柄擷取函數,它通過提供三個參數(Name,Class,Deep)來找到我們所關心的那個控件的句柄。

該函數将句柄的擷取過程公式化了,為以後的開發利用提供了很好的通用子產品。

先抛出全部代碼

using 
           

使用方法

擷取句柄,不得不提強大的spy++,我的這個子產品的使用,得首先用spy++擷取如下基本資訊

  1. 程式主視窗的“ 标題”
  2. 程式主視窗的的“ 類”
  3. 控件句柄在主視窗的“ 深度” (這是我這個函數最突出的地方)
一:什麼是程式主視窗
c#如何跳出一個函數_C# 句柄擷取子產品

所謂程式主視窗指,直屬#32769(桌面)下的視窗

二:“标題”和“類”怎樣找
c#如何跳出一個函數_C# 句柄擷取子產品

用句柄查找工具獲得的資訊“标題”“類”

三:Deep怎樣确認
c#如何跳出一個函數_C# 句柄擷取子產品

Deep的确認方法

從圖中我們可以看到,我要找到“有道詞典”(A)處的句柄,隻要用數數的方法一層層地确認到(A)處,然後确定它的層級表示字元串“3-1-1”即可。

類似的(B)處,它的Deep參數為“3-3”,(C)處的Deep為“5"

因為我在解算Deep字元串時用的是正規表達式,是以Deep參數對數值的隔離符号并沒有很多要求"3-1-1";"3/1/1";"3;1;1";"3 1 1"等等均可,隻要能區分處數值就行。

運作驗證

c#如何跳出一個函數_C# 句柄擷取子產品

有道詞典下 3-1-1處句柄值與spy++的一緻

c#如何跳出一個函數_C# 句柄擷取子產品

有道詞典下3-3處的句柄與spy++的一緻

c#如何跳出一個函數_C# 句柄擷取子產品

這是1-1-1-1下的句柄值,也沒錯哦

問題點求解

1:通過sendmessage發送消息失敗的問題

如開始講的那樣,我擷取句柄的根本目的是,用來給第三方應用程式的某個按鈕發送Click動作的。比如:非故障的警示對話框的消除;裝置程式某個檢視視窗的跳出與界面切換等。

但實際使用時常常發現,很多時候标準的WM_LBUTTONDOWN WM_LBUTTONUP 消息并不能觸發第三方軟體的按鈕動作(比如:STC單片機的ISP程式上的按鈕)。此時可能需要我們找到所能控制它的消息到底是什麼。

2:新出的軟體找不到按鈕的句柄

這是個很頭疼的問題,現在時新主流的軟體,用spy++掃過去就隻能得到主視窗句柄,而且句柄樹下同樣幹淨得很,而它那些按鈕明明就擺在那裡(可能是XAML技術生成的界面吧)。

如此:句柄的功用将被壓縮得無所是處! 迫切想知道,類似的軟體沒有句柄的幫助,該如何去操縱! 請大神指點!

繼續閱讀