【问题标题】:Is it possible to invoke the "Apply" button programmatically in the Control Panel?是否可以在控制面板中以编程方式调用“应用”按钮?
【发布时间】:2015-12-25 00:09:51
【问题描述】:

许多注册表更改要求您再次注销登录以应用更改。但是,如果您按下Appearance and Personalisation 部分中的Apply 按钮,则无需注销即可刷新外观:

我想知道 Windows 是否为这个函数提供了一个 API,以便可以在不退出的情况下以编程方式调用它?

如果可以只运行一个简单的控制台应用程序或 PowerShell 脚本来提交更改,那么测试一些设置会容易得多。

【问题讨论】:

  • 我可以想象的一种方法是使用 UI 自动化。
  • 您可能想查看按钮实际执行的操作,而不是尝试单击它。它可能会发送一个简单的设置更改消息,使用 p/invoke 和发送消息不会太难。
  • @RonBeyer 我想这太容易了......或者我还不知道该怎么做。 *.cpl 文件无法反编译(不是 .NET),ProcessMonitor 似乎无法记录 Windows 消息,是吗?

标签: c# .net winapi windows-8.1 windows-10


【解决方案1】:

如果这些是使用 API 更改设置的记录方法,那么您应该更喜欢直接更改注册表。对于许多设置,您可以使用SystemParametersInfo function

假设这不起作用,您可以使用相同的方式通知应用程序发生了变化:它广播WM_SETTINGCHANGE message。许多应用程序会监听该消息并在收到消息时重新加载其设置。

快速搜索发现此广播的 C# 版本:c# Registry - commit changes on the MSDN forums

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, (UIntPtr)0, "Environment", SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 5000, out result);

【讨论】:

  • 我稍后试试看是否出现Please wait...屏幕。
  • 我在调用中使用了WindowMetrics 的注册表项,procmon 记录的唯一处理此消息的应用程序是 JDownloader ;-) 我想我需要捕获从显示窗口发送的所有消息(如果可能的话)并查看如果它为此使用任何消息会做什么。我希望对一些 ReloadSomeRegistrySettings API 有一个神奇的调用来解决这个问题。
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多