C# は FindWindow と FindWindowEx を使用してフォームとコントロールを検索し、下線付きのタイトルを持つコントロールを検索する方法を説明します。

C# は win32 関数をインポートする必要があります

System.Runtime.InteropServices を使用します。

/// <summary>
        /// ウィンドウ ハンドル関数の取得
        /// </summary>
        /// <param name="lpClassName">ウィンドウ クラス名</param>
        /// <param name="lpWindowName" >Windowタイトル名</param>
        /// <returns>リターンハンドル</returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName) ;

機能紹介:

関数 function: この関数は、クラス名とフォーム名が指定された文字列と一致するトップレベル フォームのハンドルを取得します。この関数はサブフォームを検索しません。検索時に大文字と小文字を区別しないでください。

    関数タイプ: HWND FindWindow (LPCTSTR IpClassName, LPCTSTR IpWindowName);

    パラメータ:

    IpClassName: クラス名を指定する null で終了する文字列、またはクラス名文字列を識別するメンバーへのポインタを指します。パラメーターがメンバーであると仮定すると、前回 GlobafAddAtom 関数を呼び出して生成されたグローバル メンバーである必要があります。このメンバーは 16 ビットで、IpClassName の下位 16 ビットに配置され、上位ビットは 0 である必要があります。

    IpWindowName: ウィンドウ名 (ウィンドウ タイトル) を指定する null で終わる文字列を指します。パラメータが空の場合、すべてのフォームが一致します。

    戻り値: 関数が成功した場合、戻り値は指定されたクラス名とフォーム名を持つフォーム ハンドルであり、関数が失敗した場合、戻り値は NULL です。

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

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

機能紹介:

関数数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);

 パラメータ:

    hwndParent: 子ウィンドウを検索するための親ウィンドウのハンドル。

    hwnjParent が NULL の場合、関数はデスクトップ ウィンドウを親ウィンドウとして使用して、デスクトップ ウィンドウのすべての子ウィンドウを検索します。

    Windows NT5.0 以降: hwndParent が HWND_MESSAGE の場合、関数はすべてのメッセージ ウィンドウのみを検索します。

    hwndChildAfter : 子ウィンドウ ハンドル。検索は、Z オーダーで次の子ウィンドウから開始されます。子ウィンドウは、子孫ウィンドウではなく、hwndPareRt ウィンドウの直接の子ウィンドウである必要があります。HwndChildAfter が NULL の場合、検索は hwndParent の最初の子ウィンドウから開始されます。hwndParent と hwndChildAfter の両方が NULL の場合、関数はすべてのトップレベル ウィンドウとメッセージ ウィンドウを検索します。

    lpszClass: クラス名を指定するヌル終了文字列へのポインタ、またはクラス名文字列を識別するメンバーへのポインタ。パラメーターがメンバーである場合、それは前の GlobaIAddAtom 関数の呼び出しによって生成されたグローバル メンバーである必要があります。このメンバーは 16 ビットで、lpClassName の下位 16 ビットに配置され、上位ビットは 0 である必要があります。

    lpszWindow: ウィンドウ名 (ウィンドウ タイトル) を指定する null で終わる文字列へのポインタ。このパラメータが NULL の場合、すべてのウィンドウが完全に一致します。戻り値: 関数が成功した場合、戻り値は指定されたクラス名とウィンドウ名を持つウィンドウ ハンドルです。関数が失敗した場合、戻り値は NULL になります。

使用法:

 const int BM_CLICK = 0xF5; 
 IntPtr maindHwnd = FindWindow(null, "QQ user login"); //QQ ログイン ボックスのハンドルを取得
 if (maindHwnd != IntPtr.Zero) 
 { 
     IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero) , null , "Login"); //ボタンのハンドルを取得
     if (childHwnd != IntPtr.Zero) 
     { 
         SendMessage(childHwnd, BM_CLICK, 0, 0); // ボタンをクリックしたメッセージを送信
     } 
     else 
     { 
         MessageBox .Show("子ウィンドウが見つかりません"); 
     } 
 } 
 else 
 { 
     MessageBox.Show("ウィンドウが見つかりません"); 
 }

ただし、使用中にコントロールのタイトルに下線が引かれる場合があるため、次のように検索時に「&」記号を追加する必要があります。

IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "&N"); //ボタンのハンドルを取得

おすすめ

転載: blog.csdn.net/yunxiaobaobei/article/details/90436906#comments_25621233