我正在创建一个简单的Windows cmd程序,我正在尝试确保它只运行一次(如果你双击exe文件,只会显示一个实例.. 所以在我的代码中...我添加了一个命名的互斥锁(名称是一个GUID)..如果程序的第二个实例启动,它会显示消息告诉你,你已经有一个实例正在运行..
我想要做的是升级代码。因此,它不会向您显示消息,而是自动查找已在运行的进程(窗口),将焦点切换到它,然后自行关闭。
现在我正在尝试使用
FindWindow(NULL,window_name);
SetForegroundWindow(window);
但是,当我传递窗口名称(来自任务管理器)时,它找不到它! 错误说:未使用:S 这很奇怪, 我甚至尝试使用任务管理器名称..它仍然无法找到它!
某些人可以向我指出,我哪里出错了? :) 另外,如果你能想到任何其他方式完成这样的任务,请告诉我.. 注意:工作中的一些朋友告诉我使用enumwindows,这是一个不错的选择(我目前正在阅读它)... 很多!答案 0 :(得分:1)
以下是关于此主题的优秀文章http://delphi.about.com/od/windowsshellapi/l/aa100703c.htm。
控制应用程序实例的数量
Zarko Gajic的- Delphi编程指南
在本文中,您将学习如何使用 “run-once enable”一个Delphi 可以检查它的应用程序 上一个(运行)实例。沿 这个过程,几种技巧 实施这样的检查将是 讨论;以及如何带来 你已经在运行的应用程序 前景,如果用户试图 再“运行一次”。到了最后 你要复印的文章 代码来控制你的行为 应用程序的多个实例: 可以选择限制数量 正在运行实例。
提供的解决方案是用Delphi编写的,但代码很容易理解,应该很容易翻译成C ++。
答案 1 :(得分:1)
EnumWindows
非常有用。
我不确定“来自任务管理员的名字”是什么意思,但FindWindow
功能的第二个参数应与您的窗口标题匹配。
使用EnumWindows
的示例:
BOOL CALLBACK WorkerProc(HWND hwnd, LPARAM lParam) {
static TCHAR buffer[50];
GetWindowText(hwnd, buffer, 50);
if(_tcsstr(buffer, "window name goes here")) {
// do something with hwnd here
return FALSE;
}
return TRUE;
}
然后像这样称呼它:
EnumWindows(WorkerProc, NULL);
答案 2 :(得分:1)
您需要的是Singleton应用程序。有很多例子。我的一个朋友多年前在另一个网站上写了一篇文章。现在可能有更好的方法,但here是他的文章