2012-04-04 106 views
1

有没有办法撤销对AllowSetForegroundWindow(ASFW_ANY)的调用?撤消/重置AllowSetForegroundWindow()调用

的大图:

  • 我希望我的exe文件的同时运行一个进程。
  • 为了实现这个目标,如果一个进程已经存在,那么这个进程就会使用命名管道&相互通信,它的窗口必须放在前面。
  • 为了能够做到这一点,最新的过程必须设置AllowSetForegroundWindow()与现有的进程ID。
    • 我不想获取进程ID(对不起我的懒惰),所以我打算做的是:1.用ASFW_ANY拨打AllowSetForegroundWindow() 2.为防万一发生错误,请撤消拨打AllowSetForegroundWindow()这样别人就不能从我的过程中窃取焦点。

在简单的话,我想允许其它进程从我偷的焦点,仅在特定的时间窗口...

任何一个面临着类似的问题早,发现什么解决办法?

另外,请让我知道如果您有任何更好的建议/替代...

+0

你可以完全摆脱'AllowSetForegroundWindow'调用。当现有流程需要关注时,它会询问最新流程。如果没有请求进入,那么最新的进程什么也不做。 – 2012-04-04 19:28:09

+0

@RaymondChen我没有得到它......如果有请求进入,最新进程应该做什么? – 2012-04-05 05:11:44

+1

你说这两个进程(称它们为A和B)已经彼此通信,并且你有A调用'AllowSetForegroundWindow',以防B想调用'SetForegroundWindow'。相反,只需让B告诉A,“请在此窗口上为我调用'SetForegroundWindow'。” – 2012-04-05 08:07:38

回答

2

According to the documentation,目标进程(大概包括“任何”)将失去从你下一次偷焦点的能力,你请致电AllowSetForegroundWindow

换句话说,听起来你一次只能有一个这样的权限。

因此,您应该可以通过调用一些不存在的ID或者您自己的进程ID来取消权限。这是理论,但是,我没有测试它。

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

+0

我试图通过设置NULL作为参数,它没有工作......我会尝试用自己的进程ID,并将更新... – 2012-04-04 14:59:40

+0

我的管道通信是有点限制(非技术原因)..给自己进程ID作为参数工作如预期...谢谢! :) – 2012-04-04 15:06:22

0

如果我明白您的主要要求是一次只运行一个应用程序实例。如果你所描述的其他东西只是服从于这个要求,而不是某个更宏大的计划的一部分,那么实现这一点就更简单了。

当您的应用程序启动时,您可以创建全局命名互斥锁。所有其他实例都会看到这个互斥体,并立即退出。这里的快速和肮脏的吧:

// 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及其参数咨询documentation

+0

尽管这是主要目标,但当进程位于不同的桌面(即不同的用户空间)时,我的应用程序逻辑会变得复杂。因此,我已经开始使用命名管道了。 – 2012-04-04 15:15:38

+0

如果不是'Global',而是用'Local'作为互斥体名称的前缀,它将只对当前会话中的其他进程可见,而不是跨桌面。其他桌面上的实例将不知道且不受影响。 – irobot 2012-04-04 15:26:43

+0

让我解释为什么我说复杂: - 我想限制在全球一级的单一进程,但方式稍有不同。 - 当可执行文件也在用户B的空间中运行时,假定用户A启动该进程。因此,A的过程要求B中的过程退出,即;在某些情况下,我希望新流程从现有流程中进行控制。 – 2012-04-04 16:15:01