【问题标题】:Simple app to know if Notepad++ is running了解 Notepad++ 是否正在运行的简单应用程序
【发布时间】:2017-09-10 23:45:07
【问题描述】:

我有一个简单的应用程序,带有 1 个按钮,可以知道 Notepadd++ 是否已经打开。我已经回顾了一些主题,但我找不到合适的主题。在按钮方法里面我有:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    mutex = CreateMutex( NULL, TRUE, "Local\\$notepad++$");
    if (GetLastError() == ERROR_ALREADY_EXISTS) {
        //MessageBox::Show(..[not open]..);
    }
    //MessageBox::Show(..[open]..);
}
};

我对“Local\$notepad++$”有疑问,我收到以下错误:

argument of type "const char *" is incompatible with parameter of type "LPCWSTR"

还有这个:

'HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR)': cannot convert argument 3 from 'const char [18]' to 'LPCWSTR'

如果有其他更简单的方法可以做到这一点,请帮助我!我也尝试将名称更改为:notepad++。我正在使用 Visual Studio 2015 C++

我有评论并用作参考:

C/C++ How to tell if a program is already running?

Is using a Mutex to prevent multiple instances of the same program from running safe?

【问题讨论】:

  • 记事本是否已经使用了可以使用的互斥锁??
  • 你可以通过写L"Local\\$notepad++$"来编译它;注意 L 前缀。但不确定它是否真的有效 - 是什么让您相信 Notepad++ 创建了一个具有此名称的互斥锁?
  • 为了澄清@IgorTandetnik 的建议,LPCWSTR 是一个指向 16 位字符的字符串的指针。 const char * 用于 8 位字符。在字符串常量之前添加L 将告诉编译器将该字符串中的字符视为16 位,可以转换为LPCWSTR
  • 我不知道 Notepadd++ 是否创建互斥锁。有没有办法查出来?

标签: c++ windows singleton windows-10 mutex


【解决方案1】:
#include "Windows.h"
/*...*/
LPCSTR app_name = "Notepad++: a free (GNU) source code editor";
if (FindWindowA(0, app_name)) {
    // it's open!
} else {
    // it's not open!
}

对于您的方法,请在引号前加上 *

CreateMutex( NULL, TRUE, *"Local\\$notepad++$");

【讨论】:

    【解决方案2】:

    我有更好的解决方案:

    int processExists(char *victim){
      int res=0,ret;
      PROCESSENTRY32 proc;
      proc.dwSize=sizeof(proc);
      HANDLE snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      if(!snap){abort();}
      for(ret=Process32First(snap,&proc);ret;ret=Process32Next(snap,&proc)){
        if(strstr(proc.szExeFile,victim)){res=1;break;}
      }
      CloseHandle(snap);
      return(res);
    }
    

    然后:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
        mutex = CreateMutex( NULL, TRUE, "Local\\$notepad++$");
        if (!processExists("notepad++.exe") {
            //MessageBox::Show(..[not open]..);
        }
        //MessageBox::Show(..[open]..);
    }
    };
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2019-02-16
    • 2012-09-10
    相关资源
    最近更新 更多