powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проигнорировать лишние окна Win7
3 сообщений из 3, страница 1 из 1
Как проигнорировать лишние окна Win7
    #39186967
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо сделать стартер для чужой проги. Закрыть и запустить заново, но если она ничего не делает. "ничего не делает" определяется по отсутствию доп.окон с "крестиком".
Вроде элементарная задача. Решит потестить на калькуляторе
Написал такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
#include<iostream>
#include <windows.h>
#include <TlHelp32.h>

using namespace std;

// Получение PID по имени EXE
DWORD get_pid(const char* exe)
{
	DWORD ret = 0;
	PROCESSENTRY32 pe32 = { 0 };
	pe32.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap != INVALID_HANDLE_VALUE) {
		if (Process32First(hProcessSnap, &pe32)) {
			do {
				if (lstrcmpi(pe32.szExeFile, exe) == 0) {
					ret = pe32.th32ProcessID;
					break;
				}
			} while (Process32Next(hProcessSnap, &pe32));
		}
		CloseHandle(hProcessSnap);
	}
	return ret;
}

// Поиск окна 
typedef struct {
	uint32_t pid;
	int count;
	HWND hwnd;
} find_t;

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM find) {
	find_t* f = (find_t*) find;
	DWORD dwPID;
	GetWindowThreadProcessId(hwnd, &dwPID);
	if(dwPID == f->pid) {
		char buf[256];
		if(GetWindowText(hwnd, buf, 256)) {
			cout << dwPID << " " << hwnd << " " << buf << endl;
			f->count++;
			if(!f->hwnd) f->hwnd = hwnd;
		}
	}
	return true;
}

void main()
{
	setlocale(LC_ALL, "Russian");
	cout << "Контроль запуска" << endl;
	find_t f = { 0 };
	f.pid = get_pid("calc.exe");
	if(f.pid && EnumWindows(EnumWindowsProc, (LPARAM)&f) && f.hwnd) {
		cout << "Готово" << endl;
		SendMessage(f.hwnd, WM_CLOSE, 0, 0);
	}
}


и оказалось что есть куча окон у калькулятора
Результат такой3136 001602AA Калькулятор
3136 0009022A GDI+ Window
3136 00090296 MSCTFIME UI
3136 0013028E Default IME
3136 000E0220 Default IME
Понятно что первое основное (если ему послать WM_CLOSE процесс завершается), но что вообще это за окна? По каким признакам правильно их проигнорировать?
...
Рейтинг: 0 / 0
Как проигнорировать лишние окна Win7
    #39186969
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

стиль окна проверяй - WS_VISIBLE должен быть
не должно быть стиля WS_CHILD (можно проверить на наличие WS_SYSMENU )

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms632600(v=vs.85).aspx
...
Рейтинг: 0 / 0
Как проигнорировать лишние окна Win7
    #39186974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, помогло. Добавил проверку
Код: plaintext
1.
if((GetWindowLong(hwnd, GWL_STYLE) & WS_VISIBLE) && ...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проигнорировать лишние окна Win7
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]