Windows 10 没有响应 user32.dll 的 SystemParametersInfo(uAction, uParam, lpvParam, fuWinIni) 的 uiAction 47 (SPI_SETWORKAREA)

Windows 10 not responding to uiAction 47 (SPI_SETWORKAREA) for user32.dll's SystemParametersInfo(uAction, uParam, lpvParam, fuWinIni)

有人知道为什么 Windows 10 不再允许您使用 SystemParametersInfo 设置自定义 WorkArea 吗?我用它来为 dock/bar 应用程序保留屏幕 space。有人有幸让它工作吗?

作为参考,此问题的代码可用于在 Windows 8.1、8、7 和 XP 中设置自定义工作区,但不再适用于 Windows 10。 How can I resize the desktop work area using the SPI_SETWORKAREA flag?

我唯一的替代选择似乎是使用 SHAppBarMessage(不可取,因为据我所知,它不允许修改表单不透明度),或者使用带有 WH_CALLWNDPROC 的 SetWindowsHookEx,但这似乎需要为外部进程注入 .dll?

我遇到了类似的问题,一个在 Windows 7 中正确设置工作区的旧程序在 Windows 10 中停止工作。

对我有用的是将 'fWinIni' 参数(最后一个参数)从 SPIF_CHANGE 更改为 SPIF_UPDATEINIFILE。

所以,以前有效但不再有效的方法:

private const uint SPIF_SENDWININICHANGE = 2;
private const uint SPIF_UPDATEINIFILE = 1;
private const uint SPIF_CHANGE = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE;
SystemParametersInfo(SPI_SETWORKAREA, 0, ref rect, SPIF_CHANGE);

现在可以正常工作的内容:

private const uint SPIF_SENDWININICHANGE = 2;
private const uint SPIF_UPDATEINIFILE = 1;
private const uint SPIF_CHANGE = SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE;
SystemParametersInfo(SPI_SETWORKAREA, 0, ref rect, SPIF_UPDATEINIFILE);

希望这对你也有用。

仅供参考,当我仅在 SystemParameterInfo 发送中使用 SPIF_UPDATEINIFILE 时,我遇到了 Screen.PrimaryScreen.WorkArea 无法识别系统更改并永久设置为完整范围的问题屏幕。

SystemParametersInfo(SPI_SETWORKAREA, 0, ref rect, 0);

我在 Windows 10 时工作得更好并且正确设置了工作区变量。