0

我正在创建一个简单的 Windows cmd 程序,并且我试图确保它只运行一次(如果你双击 exe 文件,只会显示一个实例..所以在我的代码中..我添加了一个命名互斥锁(名称是一个 GUID).. 如果程序的第二个实例已启动,它会显示消息告诉您,您已经有一个实例正在运行..

我想做的是升级代码。因此,它不会向您显示消息,而是会自动找到已经运行的进程(窗口),将焦点切换到它,然后自行关闭。

现在我正在尝试使用

 FindWindow(NULL,window_name);
 SetForegroundWindow(window);

但是,当我传递窗口名称(来自任务管理器)时,它找不到它!错误说:未使用:S,这很奇怪,我什至尝试使用任务管理器名称来代替..它仍然找不到它!

所以有人可以向我指出,我哪里出错了?:) 另外,如果你能想到任何其他方法来完成这样的任务,请告诉我..

注意:工作中的一些朋友告诉我使用 enumwindows,这是一个不错的选择(我目前正在阅读它)... 非常感谢!

4

3 回答 3

1

这是一篇关于这个主题的优秀文章http://delphi.about.com/od/windowsshellapi/l/aa100703c.htm 。

控制应用程序实例的数量

Zarko Gajic - About.com Delphi 编程指南

在本文中,您将学习如何“启用一次运行”Delphi 应用程序,该应用程序可以检查其先前(正在运行的)实例。在此过程中,将讨论实现这种检查的几种技术;以及如何将您已经运行的应用程序带到前台,如果用户尝试“再一次”运行它。在本文结束时,您将获得一个复制代码来控制应用程序的多个实例的行为:可以选择限制运行实例的数量。

提供的解决方案是用 Delphi 编程的,但代码很容易理解,应该很容易翻译成 C++。

于 2009-08-03T08:42:28.897 回答
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);
于 2009-08-03T08:49:47.007 回答
1

您需要的是一个单例应用程序。这方面的例子很多。多年前,我的一个朋友在另一个网站上写了一篇文章。现在可能有更好的方法,但这是他的文章

于 2009-08-03T08:52:17.000 回答