扩展 WebBrowser 控件 DragWebBrowser FlashGameWebBrowser

16 篇文章 1 订阅
14 篇文章 0 订阅
本文介绍了如何扩展WebBrowser控件以支持拖放操作,特别是针对小游戏网站的应用。通过调用DragAcceptFiles API函数并处理WM_DROPFILES消息,实现了获取拖入文件路径的功能,允许用户在游戏中进行拖放操作。
摘要由CSDN通过智能技术生成

最近朋友叫我帮做一个跟其小游戏网站配套的程序,考虑用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.dllcsExWBDLMan.dll 这两个文件。

看看效果示(例中带的爆炸台球是从网上下载的,版权归其作者所有):






源码下载

声明:

转载请保留以下版权信息。

作者:Starts_2000

网站:http://www.csharpwin.com CS 程序员之窗

你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值