您的位置:首页 > 其它

关于无边框EXE程序窗口嵌入IE浏览器WebBrowser右键属性窗口无法点击响应问题的解决

2015-12-29 15:32 453 查看
好久没写博客了,今天有空写点。最近遇到个问题,就是我有一个Delphi写的exe程序,主窗口没有边框(Style=bsNone),标题和边框都是自己画的,然后我嵌了一个TWebBrowser浏览器,一直用着也没事,最近有用户投诉说浏览页面中右键属性窗口不可以点,试了下还真是这样。

于是开始折腾,这嵌入浏览器我用得较多,也不是第一次用,于是找了几个以前用过的EXE程序来试,但结果一切正常,唯独这个EXE不行。而且别的菜单(如打印和打印预览)弹出的窗口都很正常,只有属性窗口不行。正常属性窗口是弹在主程序左上角的,这个不响应的属性窗口则是弹在主程序下边偏右一点,鼠标点击完全无用,但可以按ESC键关闭,但前提是不能切换窗口,只要一切换窗口,你就再也无法将它关闭,整个程序无响应,只能强制结束。

接着研究代码、事件,事件代码都没什么,但发现有写消息钩子,会不会是钩子的问题呢?于是反复尝试把消息去掉、加上,结果还是老样子。而且别的程序也有用这个钩子,因此排除是钩子的问题。

然后开始用排除法,把无关的代码一一去掉,只剩下Create、SetParent、Navigate几行代码了,尼码还是不行。

于是我重新创建了一个空的程序,主窗口只放一个浏览器和一个按钮,点按钮时直接navigate到百度,运行,结果当然是正常了。

看来跟主程序有关。主程序有点复杂,无法将所有代码去掉,不过这时我想到了可能跟无边框风格有关,我把边框改回为sizable,结果不出所料,一切正常,右键属性窗口可以用了。

为了确认问题,我回到重新创建的一个空的程序,主窗口只放一个浏览器和一个按钮,点按钮时直接navigate到百度,把边框设置为bsNone,运行,右键属性一看,果然不响应了。看来就是边框导致的了。接着又尝试了其它几种边框,发现只有sizable的边框下才正常。

问题原因算是找到了,虽然我不知道最底层原因是什么,但毕竟知道跟无边框有关了。如何解决呢?出于需要我并不能简单把边框加上。上网搜索了下,果然有类似的案例,都是无边框导致的。其中有人说到解决办法是继承CreateParams方法,把Style的WS_THICKFRAME加上,试了下倒是确实可以,但会加一圈边框,感觉较怪异。

接着研究边框bsNone,发现BorderStyle为bsNone时,主要是增加了WS_POPUP这个样式,而不管边框是什么,这个样式一加上,浏览器属性窗口就铁定不响应了。因此问题归结到如何去掉WS_POPUP上。

尝试在CreateParams方法,把Style中的WS_POPUP去掉(Params.Style := Params.Style and not WS_POPUP),结果一看,边框和标题都给加上了,晕。

怎么办呢?难道只能加上边框了?这时网上看到了另外一个解决办法,就是创建窗口时不用bsNone和WS_POPUP,创建完成后再用SetWindowLong把窗口标题去掉,这样既可以避免WS_POPUP,又可以保留无边框效果。于是立马试验,在正常创建完带边框的窗口后执行以下代码去除标题边框:

SetWindowLong(Form1.Handle, GWL_STYLE, GetWindowLong(Form1.Handle, GWL_STYLE) and not (WS_CAPTION or WS_THICKFRAME or WS_SYSMENU));

编译运行,果然边框标题都去掉了,嵌入浏览器的右键属性也可以正常使用,问题解决。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: