小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Win32 API對文本框發(fā)送消息(多個文本Edit,動態(tài) 控件 ID) - Soma -...

 蘇州小吳 2010-12-04

Win32 API對文本框發(fā)送消息(多個文本Edit,動態(tài) 控件 ID)

最近在群里有人說用Win32 Api不能對文本框設置內(nèi)容(是別人寫的一個程序,設置它的文本框的值).但是搞過win32的人都會說.這個應該不難啊,大概是搞.net的人,被微軟 寵壞了.基本都不要用win32 api,這里我也不討論用這個東西好不好,反正有人有這個需求,就要去做這個東西,我就自己建了一個工程,只要得到這個窗體的句柄,然后向他發(fā)送消息就搞定了,用到FindWindow,SendMessage搞定就可以了,我們所做的最核心的內(nèi)容就是要找句柄.

要在win32 api下面使用FindWindow,SendMessage,必須這2個聲明

代碼
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError =true)]
        
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

 

記得這里要加上CharSet,否則發(fā)送中文可能是亂碼,調(diào)用的時候

查找窗體的句柄,然后再在這個窗體下面查找這個文本框的句柄,窗口我們是根據(jù)窗體的標題文本來查找,文本控件時根據(jù)控件的類型來找.

IntPtr hwndCalc = WinAPIuser32.FindWindow(null"Form1aa");

IntPtr hwndtext 
= WinAPIuser32.FindWindowEx(hwndCalc, 0,"Edit",null);

 

 設置文本

WinAPIuser32.SendTextMessage(hwndtext, MSCODE.WM_SETTEXT, 0"mextb1860第一個文本框");

 

輕松搞定了.很簡單.

 

這個時候我想,窗體上只有一個文本框,也就是說一個Edit,查找起來是很方便,可是往往,我們在實際情況中,一個窗體上有很多文本框,我們要找到其中一個文本框設置它的值,這個時候你在用WinAPIuser32.FindWindowEx(hwndCalc, 0,"Edit",null);就做不到了.因為他得到的,始終是最后一個 文本框的句柄,也就是說如果頁面上有

3個文本,你使用這個時候只會獲取到最后一個文本框的 句柄,如果你要設置第2個文本框你是做不到的,我們有2個辦法,一個是EnumChildWindows方法來遍歷下面的所有文本框,對這些文本框進行賦值,第2中方法就是 根據(jù)控件ID來查找句柄,在一個程序編譯完成以后,也就是發(fā)布給客戶用的時候,窗體上的控件ID就是固定的了,不可改變,我這里說的控件ID不是指.net的立面一個TextBox控件的ID,而是在windows下面,顯現(xiàn)出來的ID,這樣我們就可以通過固定的ID來查找,注意ID是固定的,不會再改變,這樣我們就可以用GetDlgItem的方法來通過ID號來獲取句柄,這里我們先講第2中方法,第一種方法,比較復雜,而且后面我會用第一種方法來做一個非常特殊的演示,那就是如果控件ID時動態(tài)的時候,我們也如何獲取句柄

 

        [DllImport("user32.dll ", EntryPoint = "GetDlgItem")]
        
public static extern IntPtr GetDlgItem(
        IntPtr hDlg,
        
int nIDDlgItem
        );

 

 

當然得到了句柄還有什么做不到的,對這3個文本發(fā)送消息,設置文本內(nèi)容

 

代碼
                IntPtr hwndtext = WinAPIuser32.GetDlgItem(hwndCalc, 1247226);
                WinAPIuser32.SendTextMessage(hwndtext, MSCODE.WM_SETTEXT, 
0"mextb1860第一個文本框");

                hwndtext 
= WinAPIuser32.GetDlgItem(hwndCalc, 1181678);
                WinAPIuser32.SendTextMessage(hwndtext, MSCODE.WM_SETTEXT, 
0"mextb1860第二個文本框");

                hwndtext 
= WinAPIuser32.GetDlgItem(hwndCalc, 919180);
                WinAPIuser32.SendTextMessage(hwndtext, MSCODE.WM_SETTEXT, 
0"mextb1860第三個文本框");

 

 

一切很順利,就像我們想的一樣,3個文本框的內(nèi)容都改變了,太好了,不過不要太高興了,因為我們這里的ID是固定所以都硬編碼進去了,在一般情況下是沒有問題,因為大部分的都是固定的,這個時候我發(fā)現(xiàn).net的程序的控件ID時隨時改變的,而且每次運行一次ID都不一樣,這個ID是跟著句柄改變,句柄是多少ID就是多少,老火啊.這回要根據(jù)ID來獲取句柄是獲取是行不通了,現(xiàn)在的情況是 一個頁面多個Edit類控件的ID是動態(tài)的,程序每次運行都不一樣,不固定. 

關(guān)閉程序,再重新打開,在看下ID

那么我現(xiàn)在用第二種辦法來解決,請出EnumChildWindows方法,這個方法比較特殊,有個一個參數(shù)是一個回調(diào)函數(shù)

 

        [DllImport("user32.dll")]
        
public static extern int EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);

 

 

CallBack是一個委托

 

代碼
        [DllImport("user32.dll")]
        
public static extern int EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);
        
/// <summary>
        
/// 回調(diào)業(yè)務
        
/// </summary>
        public delegate void CallBusiness(IntPtr hwnd);
        
public delegate bool CallBack(IntPtr hwnd, int lParam);
        
/// <summary>
        
/// 遍歷子窗體的父窗體句柄
        
/// </summary>
        public static CallBack callBackEnumChildWindows = new CallBack(ChildWindowProcess);
        
/// <summary>
        
/// 委托業(yè)務,需要客戶端添加
        
/// </summary>
        public static CallBusiness CallFuntion;
        
/// <summary>
        
/// 遍歷子窗體或控件
        
/// </summary>
        
/// <param name="hWnd"></param>
        
/// <param name="lParam"></param>
        
/// <returns></returns>
        public static bool EnumChildWindows(IntPtr hWnd, int lParam)
        {
            EnumChildWindows(hWnd.ToInt32(), callBackEnumChildWindows, 
0);
            
return true;
        }
        
/// <summary>
        
/// 獲取類名字
        
/// </summary>
        
/// <param name="hwnd">需要獲取類名的句柄</param>
        
/// <param name="lpClassName">類名(執(zhí)行完成以后查看)</param>
        
/// <param name="nMaxCount">緩沖區(qū)</param>
        
/// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetClassName")]
        
public static extern int GetClassName(
            IntPtr hwnd,
            StringBuilder lpClassName,
            
int nMaxCount
        );
        
/// <summary>
        
/// 遍歷子控件
        
/// </summary>
        
/// <param name="hwnd"></param>
        
/// <param name="lParam"></param>
        
/// <returns></returns>
        public static bool ChildWindowProcess(IntPtr hwnd, int lParam)
        {
            
if (CallFuntion != null)
            {
                CallFuntion(hwnd);
            }
            
return true;
        }

 

 

EnumChildWindows用來遍歷所有的子控件的句柄,有一個回調(diào)函數(shù),CallBusiness也是一個代理,是提供給客戶端調(diào)用的時候來編寫邏輯的.代碼很簡單,應該很容易理解,客戶端調(diào)用的代碼,因為是.net開發(fā)的程序 所以 Edit的控件類型有點不一樣,不過沒關(guān)系,不影響我們查找

 

 

代碼
                List<IntPtr> list = new List<IntPtr>();
                WinAPIuser32.CallFuntion 
= delegate(IntPtr enumIntPtr)
                {
                    StringBuilder s 
= new StringBuilder(2000);
                    WinAPIuser32.GetClassName(enumIntPtr, s, 
255);
                    
if (s.ToString() == "WindowsForms10.EDIT.app.0.378734a")
                    {
                        list.Add(enumIntPtr);
                    }
                };
                WinAPIuser32.EnumChildWindows(hwndCalc, 
0);
                WinAPIuser32.CallFuntion 
= null;
                
//第1個文本框
                WinAPIuser32.SendTextMessage(list[2], MSCODE.WM_SETTEXT, 0"mextb1860第一個文本框");
                
//第2個文本框
                WinAPIuser32.SendTextMessage(list[1], MSCODE.WM_SETTEXT, 0"mextb1860第二個文本框");
                
//第3個文本框
                WinAPIuser32.SendTextMessage(list[0], MSCODE.WM_SETTEXT, 0"mextb1860第三個文本框");

 

 

代碼會提供下載,不明白的可以自己仔細看看.

/Files/mextb1860/WinAPITest.rar

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多