SetWindowLong无法在某些计算机上运行

时间:2011-11-05 07:43:04

标签: c# winapi setwindowlong

编辑:更多信息 我已将其缩小到某些计算机上的某些应用程序。我试图在某个监视器上以全屏模式启动chrome。这在我测试的大多数系统上都能很好地工作,但是我们遇到了一组运行Windows 7 Pro 32bit的计算机,这些计算机正在被正确移动和调整大小,但它们的边框和按钮仍然完好无损。

我意识到chrome窗口都是在单个chrome进程下生成的,并且它们的生命周期是易变的,但是我们已经能够使用一个单独的数据目录来解决这个问题,该目录使每个chrome实例在它自己的父进程中以这种方式启动。 Chrome似乎是我们在全屏启动时遇到问题的唯一应用程序,并且仅在一组计算机上启用。例如,在运行calc.exe时,它会最大化并删除边框,而不会在我们测试过的所有系统上出现任何问题。我已经确认每个系统上运行的chrome版本是相同的。如果有人能够更深入地了解这个问题或者进一步解决问题的方法,我将非常感激。


我正在尝试使用SetWindowLong以全屏模式运行应用程序,并且它在我尝试使用的最新计算机上运行良好。我基本上使用的是此问题中引用的代码:Removing window border?

这适用于我的两款笔记本电脑(Windows 7旗舰版)和我测试过的几个工作盒(Windows 7 POS Embedded),但它不适用于另一台正在运行的计算机(Windows 7专业版)。 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);

2 个答案:

答案 0 :(得分:1)

发现问题。我们使用LogMeIn进行远程计算机管理,看起来他们的视频镜像驱动程序在某些机器上造成了问题。卸载镜像驱动程序并重新启动会导致所有内容按预期工作。

情况也是如此,它失败了XP的过期副本(甚至SP3,也许还有其他人)。我已在十几个工作站上确认安装推荐的更新可以解决此问题。每个人都需要平均更新,所以很难说哪个人做了这个伎俩,但显然其中一个做了。启用更新的另一个原因。

答案 1 :(得分:0)

Windows 7 Professional系统是64位吗?根据{{​​3}}

的文档
  

此函数已被SetWindowLongPtr函数取代。要编写与32位和64位版本的Windows兼容的代码,请使用SetWindowLongPtr函数。

尝试修改代码以在64位系统上调用SetWindowLong函数,看看会发生什么。