Undo / Reset AllowSetForegroundWindow() calls

Undo / Reset AllowSetForegroundWindow() calls

本文关键字:calls AllowSetForegroundWindow Reset Undo      更新时间:2023-10-16

是否有方法撤消对AllowSetForegroundWindow(ASFW_ANY)的调用?

大局:

  • 我希望每次运行一个exe进程
  • 为了实现这一点,进程之间使用命名管道&如果一个进程已经存在,则必须将其窗口放在前面
  • 要做到这一点,最新进程必须使用现有进程id设置AllowSetForegroundWindow()
    • 我不想获取进程id(对不起我的懒惰),所以我计划做的是:1。用ASFW_ANY 2呼叫CCD_ 3。万一出现错误,请撤消对AllowSetForegroundWindow()的调用,这样其他人就不会从我的进程中窃取焦点

简单地说,我只想让其他过程在特定的时间窗口内偷走我的注意力。。。

之前有人遇到过类似的问题,并找到了解决方法吗?

此外,如果你有更好的建议/替代方案,请告诉我。。。

根据文档,下次调用AllowSetForegroundWindow时,目标进程(可能包括"any")将失去从您那里窃取焦点的能力。

换句话说,听起来一次只能有一个这样的权限处于活动状态。

因此,您应该能够通过使用一些不存在的ID或您自己的进程ID进行调用来取消权限。然而,这是理论上的,我还没有测试过。

我个人只会通过命名管道发送目标进程ID。

如果我了解您的主要要求是一次只运行一个应用程序实例。如果你描述的其他一切都只服从于这一要求,而不是某个更宏伟计划的一部分,那么有一种更简单的方法可以实现这一点。

您可以在应用程序启动时创建一个全局命名的互斥对象。所有其他实例都将看到这个互斥锁已设置,并立即退出。这是它的快速和肮脏:

// Multiple instances detection
HANDLE my_mutex = ::CreateMutex(NULL, FALSE, "Global\MyCuteFluffyMutex" );
int create_mutex_error = ::GetLastError();
bool already_running =
          ( my_mutex && ( create_mutex_error == ERROR_ALREADY_EXISTS ))
       || ( create_mutex_error == ERROR_ACCESS_DENIED );
if ( !already_running ) {
  // Run my application
}
::CloseHandle(my_mutex);

有关CreateMutex及其参数的详细信息,请参阅文档。