API окон являются новыми для меня.Я пытаюсь найти количество окон, которые открыты из приложения Windows.Я хотел открыть только один экземпляр приложения.
У меня есть приложение abc.exe.Если пользователь пытается открыть приложение abc.exe в первый раз, то приложение abc.exe откроется нормально.Но если приложение abc.exe уже открыто, и пользователь пытается открыть его снова, он должен выдать уже открытый экземпляр приложения.
Я могу получить уже открытый экземпляр с помощью приведенного ниже кода.в определенном состоянии.
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
HWND *retHwnd = (HWND *)lParam;
if (*retHwnd) {
return FALSE;
}
DWORD procID = 0;
auto threadID = GetWindowThreadProcessId(hwnd, &procID);
auto handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, procID);
QString fileName;
if (handle) {
TCHAR filename[FILENAME_MAX];
auto len = GetModuleFileNameEx(handle, NULL, filename, FILENAME_MAX);
fileName = QFileInfo(QString::fromWCharArray(filename, len)).fileName();
if (GetLastApplicationName() == fileName) {
*retHwnd = hwnd;
}
CloseHandle(handle);
}
return TRUE;
}
void ShowExistingInstance() {
HWND hwnd = 0;
auto res = EnumWindows(&EnumWindowsProc, (LPARAM)&hwnd);
if (hwnd) {
ShowWindow(hwnd, SW_MINIMIZE);
ShowWindow(hwnd, SW_MINIMIZE);
ShowWindow(hwnd, SW_RESTORE);
}
}
Однако я не получаю первый экземпляр приложения, если из приложения открыты два окна.
Ниже я упомяну две ситуации.В первой ситуации код работает нормально, а во второй - код не работает нормально.
1) Получить уже открытый экземпляр приложения
Шаги:
a. Пользователь нажимает на значок приложения abc.exe,
b. Главное окно открыто, например, его имя mainWindow1
.
c. Восстановить или свернуть mainWindow1
d. Пользователь снова нажимает abc.exe, используя значок приложения
e. Здесь я получаю mainWindow1
, и это правильно.
2) Не получает уже открытый экземпляр приложения
Шаги:
a. Пользователь нажимает на abc.exeзначок приложения.
b. Главное окно открыто, например, его имя mainWindow1
.
c. Пользователь открывает другое окно изтекущее приложение, например, его имя mainWindow2
.(mainWindow1
не является родителем mainWindow2
).
d. Восстановление вниз или сворачивание mainWindow1
(здесь mainWindow2
также минимизировано или Восстановление автоматически вниз mainWindow1
)
e. Пользователь снова нажимает abc.exe, используя значок приложения.
f. Здесь я получаю mainWindow2
вместо mainWindow1
.
, который я хотелнекоторая направляющая линия для Windows API, которая помогает мне найти Hwnd of Mainwidnow1 во второй ситуации.