我的问题是无法在Internet Explorer中获得flash子控件,但我可以在webbrowser控件中执行此操作。 webbrowser控件是flash对象的错误,因此我需要通过Internet Explorer完成工作并自动执行flash测试。
以下是我试图在IE 11中复制的webbrowser控件的代码。
private async Task<bool> clickCoorindate(Point point)
{
IntPtr handle = null;
Process[] processes = Process.GetProcessesByName("iexplore");
foreach (Process p in processes)
{
handle = p.MainWindowHandle;
}
//webBrowser1.Focus();
int x = point.X;
int y = point.Y;
// IntPtr handle = webBrowser1.Handle;
StringBuilder className = new StringBuilder(100);
while (className.ToString() != "MacromediaFlashPlayerActiveX")
{
handle = GetWindow(handle, 5); // Get a handle to the child window
GetClassName(handle, className, className.Capacity);
}
IntPtr lParam = (IntPtr)((y << 16) | x); // The coordinates
IntPtr wParam = IntPtr.Zero; // Additional parameters for the click (e.g. Ctrl)
const uint downCode = 0x201; // Left click down code
const uint upCode = 0x202; // Left click up code
const uint moveCode = 0x200;
SendMessage(handle, downCode, wParam, lParam); // Mouse button down
SendMessage(handle, upCode, wParam, lParam); // Mouse button up
Thread.Sleep(20);
SendMessage(handle, downCode, wParam, lParam); // Mouse button down
SendMessage(handle, upCode, wParam, lParam); // Mouse button up
return true;
}
当我使用Spy ++时,Flash对象窗口是IE窗口的子窗口。
当我在上面的代码中传递IE mainwindow句柄时,它永远不会找到MacromediaFlashPlayerActiveX句柄。
在webbrowser控件中测试此代码并传递webbrowser控件句柄时,它会找到flash对象。
知道如何使用IE吗?
有人在这里问了一个类似的问题并找到了解决方案,但遗憾的是没有添加它。 private static bool EnumWindow(IntPtr handle, IntPtr pointer) doesn't run
上述链接中的解决方案评论:
我找到了解决方案:)。基本上,iexplorer进程定义了许多不同的窗口处理程序。我不得不使用EnumThreadWindows并获取该进程的所有Windows Handler。之后,只需查看我感兴趣的班级名称。