狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 通過窗口句柄為指定窗口發(fā)送指令(user32.dll,mshtml)

admin
2023年9月14日 19:7 本文熱度 866

本文中要處理兩種窗體的句柄控制:

常規(guī)窗口:可以輕松獲取到窗口的句柄信息,進(jìn)而獲取到窗口內(nèi)的控件的句柄,以此類推最終獲取到要定位的控件的句柄;

內(nèi)嵌瀏覽內(nèi)核:實(shí)際內(nèi)容是一個(gè)網(wǎng)頁,被包含在一個(gè)容器內(nèi)。

Spy++

spy++(spyxx)是VS自帶的開發(fā)工具,再VS安裝目錄下的tools文件夾下可以找到。它可以看到所有一已經(jīng)打開的窗口的句柄。
使用方法:
Ctrl+F打開搜索窗口,鼠標(biāo)拖動紅框的圖標(biāo),放到窗口上面,就可以獲取到窗口的句柄信息:

 

點(diǎn)擊確認(rèn)可以看到詳細(xì)信息:


點(diǎn)擊同步可以自動定位到目錄樹上的位置:

 


在目錄樹上就可以看到這個(gè)窗口下的所有控件的句柄信息:

獲取常規(guī)窗口的句柄并傳輸命令

在上面的方法中我們已經(jīng)獲取到了這個(gè)窗口的所有句柄信息。在這四個(gè)句柄中我們只關(guān)心開兩個(gè)控件,即 確認(rèn)Button 和 Edit輸入框。目標(biāo)確認(rèn),開始獲取。我們要引用user32.dll中的本地方法,主要是下面四個(gè):

//根據(jù)窗口類型或者窗口標(biāo)題獲取窗口句柄

[DllImport("User32.dll", EntryPoint = "FindWindow")]

private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 

//根據(jù)父窗口句柄、子窗口句柄、窗口類型、窗口標(biāo)題 獲取句柄

[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]

private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

/// <summary>

/// 向指定句柄的窗口發(fā)送消息

/// </summary>

/// <param name="hWnd">窗口句柄</param>

/// <param name="Msg">消息類型</param>

/// <param name="wParam">消息1</param>

/// <param name="lParam">消息2</param>

/// <returns></returns>

[DllImport("User32.dll", EntryPoint = "SendMessage")]

private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);

 

//將指定句柄的窗口置頂

[DllImport("User32.dll", EntryPoint = "SetForegroundWindow")]

private static extern bool SetForegroundWindow(IntPtr hWnd);


上述SendMessage中的第二個(gè)參數(shù)Msg類型種類很多,我們主要使用以下兩個(gè):

const int WM_SETTEXT = 0x000C; //為指定句柄的窗口設(shè)置文本信息

const int WM_CLICK = 0x00F5; //為指定句柄的窗口發(fā)送點(diǎn)擊事件


具體實(shí)現(xiàn)代碼如下:

//根據(jù)窗口名稱獲取出啊港口句柄

IntPtr IPWnd = new IntPtr(0);

IPWnd = FindWindow(null, "運(yùn)維客戶端");

if (IPWnd != IntPtr.Zero)

{

    //根據(jù)找到的窗口  找到里面的輸入框

    IntPtr txtWnd = new IntPtr(0);

    txtWnd = FindWindowEx(IPWnd, IntPtr.Zero, "Edit", null);

    if (txtWnd != IntPtr.Zero)

    {

        //如果找到了,就往里面輸入文本信息

        SendMessage(txtWnd, WM_SETTEXT, IntPtr.Zero, "文本信息");

    }

 

    //對于存在相同類型的控件,尋找起來是相對麻煩一些的,因?yàn)樗麄儧]有獨(dú)特的標(biāo)志,但是有獨(dú)自的index

    //如該例中的Button ,我們可以通過index獲取想要的控件句柄

    //但是因?yàn)樵摪粹o是第一個(gè),所以默認(rèn)找到的就是它,可以不做特殊處理

    //如果要按照INDEX獲取 可以使用下面的 FindWindowByIndex 方法

    IntPtr buttonQRWnd = new IntPtr(0);

    buttonQRWnd = FindWindowEx(IPWnd, IntPtr.Zero, null, null);

    if (buttonQRWnd != IntPtr.Zero)

    {

        //將窗體置頂 點(diǎn)擊事件要確保被點(diǎn)擊的單位在最頂層,要不然點(diǎn)不到

        SetForegroundWindow(IPWnd);

        //在任何操作之前最好等待一下,在這里主要避免置頂操作還未完成就觸發(fā)點(diǎn)擊事件,從而導(dǎo)致點(diǎn)擊失效

        Thread.Sleep(150);

        //給按鈕發(fā)送點(diǎn)擊消息

        SendMessage(buttonQRWnd, WM_CLICK, IntPtr.Zero, "");

    }

}

static IntPtr FindWindowByIndex(IntPtr hWndParent, int index)

{

    if (index == 0)

        return hWndParent;

    else

    {

        int ct = 0;

        IntPtr result = IntPtr.Zero;

        do

        {

            result = FindWindowEx(hWndParent, result, "Button", null);

            if (result != IntPtr.Zero)

                ++ct;

        }

        while (ct < index && result != IntPtr.Zero);

        return result;

    }

}


獲取內(nèi)嵌網(wǎng)頁的窗體中的元素,并發(fā)送消息

獲取句柄的步驟都是一樣的,只不過在這種情況下我們基本上只能獲取到最外層的窗體內(nèi)容,里面的內(nèi)容都是Html的,我們獲取不到句柄,所以我們需要使用一個(gè)利器 mshtml,可以獲取到指定句柄窗體內(nèi)的 IHTMLDocument ,進(jìn)而獲取到指定元素。
通過 NuGet 安裝 mshtml

基礎(chǔ)使用代碼如下:

//獲取主窗口句柄

IntPtr LoginWnd = new IntPtr(0);

LoginWnd = FindWindow("OMClientPlus", null);

if (LoginWnd != IntPtr.Zero)

{

    //下面的操作都是為了找到最里面的控件的句柄

    //也就是sehlln內(nèi)包含了shellView,shellView內(nèi)又包含了ies ,最終ies才是承載html的容器控件

    //視情況按照Spy++中顯示的控件包含關(guān)系確認(rèn)最終的控件信息

    IntPtr shell = FindWindowEx(LoginWnd,IntPtr.Zero, "Shell Embedding",null);

    Thread.Sleep(50);

    IntPtr shellview = FindWindowEx(shell, IntPtr.Zero, "Shell DocObject View", null);

    Thread.Sleep(50);

    IntPtr ies = FindWindowEx(shellview, IntPtr.Zero, "Internet Explorer_Server", null);

    Thread.Sleep(50);

  

    //獲取容器控件中的HtmlDoucument

    mshtml.IHTMLDocument2 id = GetHtmlDocument(ies.ToInt32());

 

    //獲取到所有的Input類型的組件

    mshtml.IHTMLElementCollection inputs;

    inputs = (mshtml.IHTMLElementCollection)id.all.tags("input");

 

    //找到用戶名

    mshtml.IHTMLElement accountElement = (mshtml.IHTMLElement)inputs.item("u",0);

    mshtml.IHTMLInputElement accountInputElement = (mshtml.IHTMLInputElement)accountElement;

    accountInputElement.value = account;

    Thread.Sleep(150);

 

    //找到密碼

    mshtml.IHTMLElement passwordElement = (mshtml.IHTMLElement)inputs.item("p", 0);

    mshtml.IHTMLInputElement passwordInputElement = (mshtml.IHTMLInputElement)passwordElement;

    passwordInputElement.value = password;

    Thread.Sleep(150);

 

    //點(diǎn)擊確認(rèn)按鈕

    mshtml.IHTMLElement login = (mshtml.IHTMLElement)inputs.item("Login", 0);

    login.click();

}

public mshtml.IHTMLDocument2 GetHtmlDocument(int hwnd)

 {

     System.Object domObject = new System.Object();

     int tempInt = 0;

     System.Guid guidIEDocument2 = new Guid();

     int WM_Html_GETOBJECT = Win32API.RegisterWindowMessage("WM_Html_GETOBJECT");//定義一個(gè)新的窗口消息

     int W = Win32API.SendMessage(hwnd, WM_Html_GETOBJECT, 0, ref tempInt);//注:第二個(gè)參數(shù)是RegisterWindowMessage函數(shù)的返回值

     int lreturn = Win32API.ObjectfromLresult(W, ref guidIEDocument2, 0, ref domObject);

     mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)domObject;

     return doc;

 }

如上就是mshtml 的簡單用法,更多使用方法還需不斷深入探索。


該文章在 2023/9/14 19:07:44 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved