IEで実行されているWebページでユーザーコントロールのハンドルをプログラムで見つけるにはどうすればよいですか?
Spy ++を使用して見つけることができますが、ハンドルが変化し続けるため、行き詰まります。
私はFindWindow()を使用しようとしていますが、運がありません:(何か間違ったことをしているのか、それとも単にWindowsでしか機能しないのか疑問に思います...
前もって感謝します、
ズブロッカ
WPFのIEコントロール内でPDFActiveXコントロールを見つけるのと同様の問題がありました。
この問題を解決するために、EnumChildWindows
APIを使用して正しい子ウィンドウを見つけ、そのハンドルを取得しました。
できるだけ多くのコードを含めます。
private static IntPtr FindPdfControlWindow(IntPtr parentHandle)
{
IntPtr result = IntPtr.Zero;
IntPtr matchPointer = IntPtr.Zero;
try
{
//allocate unmanaged memory for the result of the callback delegate
matchPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
Marshal.WriteIntPtr(matchPointer, IntPtr.Zero)
//instantiate the delegate and pass to the API
NativeMethods.EnumWindowProc windowChecker = CheckForPdfControlWindow;
if (!NativeMethods.EnumChildWindows(parentHandle,
windowChecker,
matchPointer))
}
finally
{
if (matchPointer != IntPtr.Zero) Marshal.FreeHGlobal(matchPointer);
}
return result;
}
private static bool CheckForPdfControlWindow(IntPtr handle,
IntPtr matchPointer)
{
int captionLength = NativeMehtods.GetWindowTextLength(handle);
if (captionLength > 0)
{
StringBuilder buffer = new StringBuilder(captionLength + 1);
NativeMethods.GetWindowText(handle, buffer, buffer.Capacity);
if (buffer.ToString().Contains("Adobe"))
{
Marhsal.WriteIntPtr(matchPointer, handle)
return false;
}
}
return true;
}
private static class NativeMethods
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool EnumChildWindows(IntPtr window,
EnumWindowProc callback,
IntPtr i);
internal delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSer.Auto)]
internal static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern int GetWindowText(IntPtr hWnd,
StringBuilder lpString,
int nMaxCount);
}
急いで転写されたので、それが有用で正確であることを願っています。
ActiveXコントロールがウィンドウ化されている場合は、そのIOleWindowインターフェイスにクエリを実行してウィンドウハンドルを取得できます。
ActiveXからインターフェイスをクエリする前に、ページのHTMLを確認して、要素IDなどのドキュメント内のactivexを識別する方法を見つける必要があります。