最近朋友叫我帮做一个跟其小游戏网站配套的程序,考虑用WebBrowser 直接加载游戏,并且支持拖放。
对于拖放操作,WebBrowser 默认对拖入的文件都是直接打开的,我通过API函数
DragQueryFile 实现了得到拖入的文件路径。看看DragWebBrowser 的关键代码:
[DllImport("shell32.dll")]
private static extern void DragAcceptFiles(IntPtr hWnd, bool fAccept);
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
if (!DesignMode)
{
DragAcceptFiles(Handle, true);
}
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DROPFILES)
{
uint count = DragQueryFile(m.WParam, 0xffffffff, null, 0);
string[] files = new string[count];
StringBuilder file = new StringBuilder(1024);
for (uint i = 0; i < count; i++)
{
DragQueryFile(m.WParam, i, file, 1024);
files[i] = file.ToString();
}
OnDragFile(new DragFileEventArgs(files));
return;
}
base.WndProc(ref m);
}
看看效果:
对于加载游戏,开始以为很简单,所以写好后也没去测试。后来发现 WebBrowser 加载游戏根本就不能玩,很久也没解决,后来想想以前在CoderProject上看到的一个封装非常完全的 WebBrowser csEXWB,用它也没能解决。但想想直接用IE加载都没问题,说明是.NET的封装问题,所以用SPY++查看它们加载游戏后的消息,最后发现 .NET 总是默认处理了WM_GETDLGCODE 消息。在 MSDN 上查到对他的解释:
The WM_GETDLGCODE message is sent to the window procedure associated with a control. By default, the system handles all keyboard input to the control; the system interprets certain types of keyboard input as dialog box navigation keys. To override this default behavior, the control can respond to the WM_GETDLGCODE message to indicate the types of input it wants to process itself.
也就是说windows用这个消息来判断哪些类型的输入交给控件本身来处理。而对于方向键啊,TAB键啊,这些操作,又是基本由 .NET 自己处理了,有了点头绪,抱着试试看的心态,没想到还真解决了。其实很简单,看看关键代码:
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_GETDLGCODE)
{
m.Result = TRUE;
return;
}
base.WndProc(ref m);
}
需要注意的是,csEXWB 是COM 控件,请先运行 Debug 目录下的 Selfregister.BAT 注册它,而且必须要包含csExWB.dll,csExWBDLMan.dll 这两个文件。
看看效果示(例中带的爆炸台球是从网上下载的,版权归其作者所有):
声明:
转载请保留以下版权信息。
作者:Starts_2000
网站:http://www.csharpwin.com CS 程序员之窗。
你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息。