我想知道是否有办法锁定Flash窗口并向其发送消息?这里的另一个人得到了答案,他的名字是Spencer K.他的问题是: Sending simulated click via WebBrowser in C# to flash object embedded in HTML
不幸的是,K先生并不是非常具体,而且他为阅读他的问题的人留下的只是他“得到了手柄,然后通过手柄迭代。”我不太确定他的意思。我使用EnumWindows遍历所有可见的句柄都无济于事,因为它没有返回一个闪存窗口的窗口。
我希望有人能告诉我,因为过去几天我一直在疯狂。
编辑:我刚刚决定在我的表单中插入SWF对象并将消息发布到该句柄。
答案 0 :(得分:8)
实际上flash窗口也有自己的手柄。要获得它,你必须从Spy ++中获取它所嵌入的控件的类名,然后你就可以达到它:
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);
public IntPtr Flash()
{
IntPtr pControl;
pControl = FindWindowEx(webBrowser1.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero);
pControl = FindWindowEx(pControl, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
pControl = FindWindowEx(pControl, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
pControl = FindWindowEx(pControl, IntPtr.Zero, "MacromediaFlashPlayerActiveX", IntPtr.Zero);
return pControl;
}
获得句柄后,您可以发布点击次数:
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public enum WMessages : int
{
WM_LBUTTONDOWN = 0x201,
WM_LBUTTONUP = 0x202
}
private int MAKELPARAM(int p, int p_2)
{
return ((p_2 << 16) | (p & 0xFFFF));
}
public void DoMouseLeftClick(IntPtr handle, Point x)
{
PostMessage(handle, (uint)WMessages.WM_LBUTTONDOWN, 0, MAKELPARAM(x.X, x.Y));
PostMessage(handle, (uint)WMessages.WM_LBUTTONUP, 0, MAKELPARAM(x.X, x.Y));
}
积分将相对于客户,所以当你保存它们时,你应该保存它:
List<Point> plist = new List<Point>();
private void webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
switch (e.KeyCode)
{
case Keys.C:
plist.Add(webBrowser1.PointToClient(Cursor.Position));
break;
default:
break;
}
}
希望这是有帮助的
答案 1 :(得分:1)
你可以通过javascript完成。
导入此内容:
import flash.external.ExternalInterface;
将此与您的AS代码相符:
if (ExternalInterface.available) {
// add external interface
ExternalInterface.addCallback("jsFunction", asFunction);
}
public static function asFunction(message:String):void {
}
在flash对象的JS对象上,您可以调用此函数:
jsObject.jsFunction("message");
这是获取flash对象的js对象的函数:
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
jsObject = InternetExplorer ? window.jsObjectName: window.document.jsObjectName;
我没有测试这段代码,我只是将它从项目中复制出来。
编辑:添加了js函数来获取js对象
答案 2 :(得分:0)
Flash窗口可能没有自己的句柄,因为它嵌入在网页中。您可能希望将消息发布到Web浏览器窗口(这就是K先生所做的)。
如果这对您不起作用,我唯一知道的其他选项是通过WebDriver或WatiN控制浏览器,并使用javascript与flash对象进行交互。
答案 3 :(得分:0)
用于调用flash对象中的函数你可以使用这段代码
swfobject.CallFunction(
"<invoke name=\"yourfunction\" returntype=\"xml\">" +
" <arguments><number>" yourvalue "</number></arguments> </invoke> ");
有关详情,请点击此链接:communicate-betwen-c-and-an-embeded-flash-application
我在我的表单应用程序中尝试使用flash对象并且它可以工作,但我没有将它用于webbrowser