SetWindowLong在某些计算机上不起作用
本文关键字:不起作用 计算机 SetWindowLong | 更新日期: 2023-09-27 18:13:31
编辑:更多信息我已经把范围缩小到特定电脑上的特定应用程序。我正在尝试在某个显示器上以全屏模式启动chrome。这在我测试过的大多数系统上都能很好地工作,但我们遇到了一组运行Windows 7 Pro 32位的电脑,它们可以正确移动和调整大小,但它们的边框和按钮仍然完好无损。
我意识到chrome窗口都在单个chrome进程下生成,并且它们的生命周期是不稳定的,但是我们已经能够使用一个单独的数据目录来解决这个问题,该目录使每个chrome实例在它自己的父进程中以这种方式启动。Chrome似乎是唯一一款我们只能在一套电脑上全屏启动的应用程序。例如,当运行calc.exe时,它在我们测试过的所有系统上最大化并删除边界而没有任何问题。我已经确认每个系统上运行的chrome版本是相同的。如果有人对这个问题有更深入的了解,或者有进一步排除问题的方法,我将不胜感激。
我正在尝试使用SetWindowLong在全屏模式下运行一个应用程序,直到我在最新的计算机上试用它为止,它一直工作得很好。我基本上使用这个问题中引用的代码:删除窗口边框?
这在我的笔记本电脑(Windows 7 Ultimate)和我测试过的几个工作盒(Windows 7 POS Embedded)上都很好,但在另一台电脑(Windows 7 Professional)上不起作用。SetWindowLong调用返回了预期的值,这表明它应该工作,调用SetWindowPos工作得很好,因为它正确地调整了窗口的大小,但是边框和按钮仍然在那里!它的功能就好像根本没有调用SetWindowLong。如果你能帮助我,我将不胜感激,因为我现在实在想不出办法了。
编辑:这是所有的代码在它的1AM红眼荣耀。几乎是链接问题的直接复制。
int lStyle = GetWindowLong(process.MainWindowHandle, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
_logger.Debug(String.Format("Style: {0}", lStyle)); // 369295360
var swlResult = SetWindowLong(process.MainWindowHandle, GWL_STYLE, lStyle);
_logger.Debug(String.Format("SetWindowLong: {0}", swlResult)); // 382664704
int lExStyle = GetWindowLong(process.MainWindowHandle, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(process.MainWindowHandle, GWL_EXSTYLE, lExStyle);
Screen screen = GetDisplay(display);
return SetWindowPos(
process.MainWindowHandle,
HWND_TOPMOST,
screen.WorkingArea.Left,
screen.WorkingArea.Top,
screen.WorkingArea.Width,
screen.WorkingArea.Height,
SetWindowPosFlags.SWP_FRAMECHANGED);
找到问题。我们正在使用LogMeIn进行远程计算机管理,似乎他们的视频镜像驱动程序在某些机器上引起了问题。卸载他们的镜像驱动程序,并重新启动,使一切按预期工作。
对于过时的XP(甚至是SP3,也许还有其他版本),这种方法也会失败。我已经在十几个工作站上确认,安装推荐的更新可以解决这个问题。每款游戏都需要进行平均更新,所以很难说哪款游戏做到了这一点,但显然其中一款游戏做到了。这是启用更新的另一个原因。
Windows 7 Professional系统是64位的吗?根据SetWindowLong
的文档这个函数已经被SetWindowLongPtr函数所取代。要编写兼容32位和64位Windows版本的代码,请使用SetWindowLongPtr函数。
试着修改你的代码,在64位系统上调用SetWindowLongPtr函数,看看会发生什么。