Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как проигнорировать лишние окна Win7 / 3 сообщений из 3, страница 1 из 1
06.03.2016, 20:17
    #39186967
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проигнорировать лишние окна Win7
Надо сделать стартер для чужой проги. Закрыть и запустить заново, но если она ничего не делает. "ничего не делает" определяется по отсутствию доп.окон с "крестиком".
Вроде элементарная задача. Решит потестить на калькуляторе
Написал такой код
Код: 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
06.03.2016, 20:33
    #39186969
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проигнорировать лишние окна Win7
Dima T,

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

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


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