Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 27.06.2013, 08:48   #1
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию EnumThreadWindows

Код:
DWORD gta_pid;
HWND  gta_hwnd;

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[])
{
	STARTUPINFO si;
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);

	PROCESS_INFORMATION pi;
	ZeroMemory(&pi, sizeof(pi));

	if(!CreateProcessW(L"F://GTA_SA//gta_sa.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
	    std::cout << GetLastError() << std::endl;

	SetProcessAffinityMask(pi.hProcess, 0x00000001);

	gta_pid = pi.dwProcessId;

	if (!EnumThreadWindows(gta_pid, EnumWindowsProc, NULL))
	    std::cout << GetLastError() << std::endl;

	SetForegroundWindow(gta_hwnd);
	
	WaitForSingleObject(pi.hProcess, INFINITE);

	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);

	return 0;
}

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
    DWORD pid;
    GetWindowThreadProcessId(hWnd, &pid);

	std::cout << "Я выполняюсь" << std::endl;

    if(pid == gta_pid)
	{
		gta_hwnd = hWnd;
		return FALSE; // Закончим перечисление
	}

	return TRUE;
}
При выполнении такого кода переход в EnumWindowsProc не происходит, EnumThreadWindows ошибок не выдаёт...
mf_fun_mf вне форума   Ответить с цитированием
Старый 27.06.2013, 08:58   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 5,942
По умолчанию

После запуска процесса проходит какоето время, прежде чем у процесса появятся окна.

Смотрите в сторону WaitForInputIdle() но даже это не даст 100% гарантии.
waleri вне форума   Ответить с цитированием
Старый 27.06.2013, 09:12   #3
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

И пусть.
EnumThreadWindows должен перечислять все окна, а не только то, которое мне нужно

Если окно ещё не создано в консоли всё равно должно появиться "Я выполняюсь"
mf_fun_mf вне форума   Ответить с цитированием
Старый 27.06.2013, 11:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

Цитата:
Сообщение от mf_fun_mf Посмотреть сообщение
Если окно ещё не создано в консоли всё равно должно появиться "Я выполняюсь"
программа делает то что вы написали, а не то что хотели.

и кстати она вообще не будет ничего делать, вы перепутали идентификатор потока с идентификатором процесса, функция принимает первое, а не втором.
маны читать надо.
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Цитата:
EnumThreadWindows должен перечислять все окна
она должна перечислить все окна потока, а не чтото там иное.
если окон нет у потока(или неверные параметры переданы) она ничего не сделает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 27.06.2013 в 11:40.
Пепел Феникса вне форума   Ответить с цитированием
Старый 27.06.2013, 12:11   #5
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

Спасибо, Пепел Феникса, исправил.

С Калькулятором или Saints Row 3 работает на ура, а вот GTA не создаёт окно. Такое же с ним творится при вызове из BAT-файла. Наверное это из-за того, что GTA отключает Aero.

Код:
int _tmain(int argc, _TCHAR* argv[])
{
    do
    {
        gta_hwnd = FindWindowW(NULL, L"GTA: San Andreas");
    }
    while (gta_hwnd == 0);

    GetWindowThreadProcessId(gta_hwnd, &gta_pid);
    SetProcessAffinityMask(hProcess, 0x00000001);
    
    return 0;
}

Вот другой почти работающий код (окно создаётся и в GTA можно играть). Надо только получить hProcess. hWnd есть, processId есть: существует ли подходящая функция использующая известные величины?
mf_fun_mf вне форума   Ответить с цитированием
Старый 27.06.2013, 12:39   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

хэндл на процесс получается или от CreateProcess как выше.
или открывая процесс через OpenProcess(ему нужен PID)

GTA имеет окно, вопрос в другом как ищете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 27.06.2013, 17:18   #7
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

А как искать? Экран моргнул, сообщил мне о переходе в упрощённый графический режим и всё. В диспетчере задач GTA можно найти лишь в процессах, но не в приложениях. Другие проги запускаются как надо
mf_fun_mf вне форума   Ответить с цитированием
Старый 27.06.2013, 17:28   #8
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

!!!
Проблема решилась простым переносом моей программы в папку с GTA. Такое же решение и для BAT-файла (в нём тоже был вызов по полному пути).

Почему так происходит исключительно с GTA? Другим программам без разницы где находится то, что их вызывает

Последний раз редактировалось mf_fun_mf; 27.06.2013 в 19:32.
mf_fun_mf вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


15:41.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.