【问题标题】:SetWindowLong is not working on some computersSetWindowLong 在某些计算机上不起作用
【发布时间】:2011-12-22 13:29:33
【问题描述】:

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

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


我正在尝试使用 SetWindowLong 在全屏模式下运行应用程序,它一直运行良好,直到我尝试使用的最新计算机。我基本上使用这个问题中引用的代码:Removing window border?

这在我的两台笔记本电脑(Windows 7 Ultimate)和我测试过的几个工作箱(Windows 7 POS Embedded)上都可以正常工作,但在另一台工作的计算机(Windows 7 Professional)上却无法正常工作。 SetWindowLong 调用正在返回向我表明它应该工作的预期值,并且对 SetWindowPos 的调用工作正常,因为它正在正确调整窗口大小,但边框和按钮仍然存在!它的功能就好像根本没有调用 SetWindowLong 一样。非常感谢一些帮助,因为我目前没有想法。

编辑:这是凌晨 1 点红眼荣耀的代码。几乎是链接问题的直接副本。

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);

【问题讨论】:

  • 您正在使用 Winforms。只需将 FormBorderStyle 属性设置为 None。
  • 我没有使用 Windows 窗体。我正在使用 Process 类来启动一个 3rd 方应用程序,并且我正在尝试无边框全屏运行它。
  • 你确定你有正确的 HWND 吗?您的应用和目标应用是否有可能具有不同的完整性级别,从而阻止您访问它们的窗口?
  • 我很确定这是正确的 HWND。我使用 Process.Start 启动该过程并从中获取 HWND,当窗口转到正确的位置并正确调整大小时,SetWindowPos 调用似乎可以正常工作。如果是权限问题,resize 和 position 不会也失败吗?

标签: c# winapi setwindowlong


【解决方案1】:

发现问题。我们正在使用 LogMeIn 进行远程计算机管理,似乎他们的视频镜像驱动程序在某些机器上造成了问题。卸载他们的镜像驱动程序,然后重新启动会导致一切按预期工作。

如果 XP 的副本过时(甚至 SP3,也许还有其他),也会出现这种情况。我已经在十几个工作站上确认安装推荐的更新可以解决这个问题。每个都需要平均更新,所以很难说是哪一个成功了,但显然其中一个成功了。保持更新启用的另一个原因。

【讨论】:

    【解决方案2】:

    Windows 7 Professional 系统是 64 位的吗?根据SetWindowLong的文档

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

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

    【讨论】:

    • 这是一个有趣的想法,但不幸的是没有。但是,我的两台笔记本电脑都运行 64 位版本的 windows,并且他们对这段代码没有任何问题。
    • A 继续添加代码以在 64 位系统上使用 LongPtr,64 位系统仍然按预期工作,但是它对似乎忽略的单个 32 位系统没有帮助设置窗口长。
    • 已取代并不意味着已弃用。这意味着有更好的替代方案可用 - 仅此而已。
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2014-07-19
    • 2014-04-28
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多