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"); //ボタンのハンドルを取得