【发布时间】:2023-03-20 11:03:01
【问题描述】:
目前我正在开发一个 mfc 应用程序,它应该被命名为 setup.exe 并完成。在进入我被击中的地方之前,我会告诉你我所做的。 首先,我必须阻止我的应用程序的多个实例。在初级阶段,我创建了一个事件并检查::getlasterror() setup.exe 是否已经存在,如果 .exe 存在,我正在显示一个消息框。那么,有多少当我运行 exe 时,消息框会重复很多次。 所以,而不是显示那么多的消息框。我有一个想法,如果我的 setup.exe 已经存在,那么把它带到屏幕的前面。所以,我试过这样,它工作得很好。但是这里出现了我的实际问题,即,一旦我安装了一些 Windows setup.exe,它的安装正在进行中,同时我尝试运行我的 setup.exe,然后我将 Windows setup.exe 放在前面,但不是我的应用程序“setup.exe” . 这个其实是我在InitInstance中实现的如下,
BOOL CMyApp::InitInstance()
{
CWinApp::InitInstance();
AppIsAllreadyRunning();
return TRUE;
}
BOOL CMyApp::AppIsAllreadyRunning(BOOL bShow/*=TRUE*/)
{
BOOL bRunning = FALSE;
WCHAR szAppName[MAX_PATH] = {0};
::wcscpy_s(szAppName, MAX_PATH, theApp.m_pszExeName);
::wcscat_s(szAppName, MAX_PATH, L".exe");
DWORD dwOwnPID = ::GetProcessId(::GetCurrentProcess());
HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32* processInfo = new PROCESSENTRY32;
processInfo->dwSize = sizeof(PROCESSENTRY32);
int index = 0;
while(::Process32Next(hSnapShot, processInfo) != FALSE)
{
if(!::wcscmp(processInfo->szExeFile, szAppName))
{
if(processInfo->th32ProcessID != dwOwnPID)
{
if(bShow)
::EnumWindows(ShowAppEnum, processInfo->th32ProcessID);
bRunning = TRUE;
break;
}
}
}
::CloseHandle(hSnapShot);
delete processInfo;
return bRunning;
}
BOOL CALLBACK ShowAppEnum(HWND hwnd, LPARAM lParam)
{
DWORD dwID = 0;
::GetWindowThreadProcessId(hwnd, &dwID) ;
if(dwID == (DWORD)lParam)
{
if (!::IsWindowVisible(hwnd))
::ShowWindow(hwnd,SW_SHOW);
::SetForegroundWindow(hwnd);
}
return TRUE;
}
这就是我尝试过的方法。谁能让我知道如何使我的 setup.exe 与其他 setup.exe 不同,当我运行我的 setup.exe 时,它应该只出现在前面,正如我在上面首先解释的那样如果我运行不同的 setup.exe 并且正在进行一些安装,同时如果我运行我的 setup.exe,它必须启动,或者如果它已经存在,它必须放在前面。但是不同的 setup.exe已经运行的会弹出到前面(这不应该发生)。
【问题讨论】:
-
您尝试过 DDE 方法吗?
-
不,我没有。实际上我是 mfc 的新手,我不知道如何使用它。我们是否需要覆盖 CWinApp::OnDDEComand(LPTSTR lpszCommand) ?如果是这样,请详细说明如何使用它来将 setup.exe 放在前面是否存在,如果不存在
-
@Hans Passant,我仍然面临同样的问题。
标签: c++ visual-c++ mfc