Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для stupidstudent
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241

Управление другой программой: после открытия программы, в дальнейшем Handle теряется

13.12.2012, 00:54. Показов 2948. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если прога изначально работает, а потом мы ищем ее с помощью FindWindow, тогда handle есть.
почему же после открытия программы, в дальнейшем он теряется?
C++
1
2
3
4
5
6
7
8
9
10
    HWND Handle;
   if (OpenDialog1->Execute())
   {
 
    ShellExecuteW(Handle, L"open", OpenDialog1->FileName.c_str(), NULL, NULL, SW_SHOWNORMAL);
    Handle = FindWindow(NULL, OpenDialog1->FileName.c_str());
    if (Handle) // почему нет хэндла ? 
        ShowMessage("god");
 
   }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2012, 00:54
Ответы с готовыми решениями:

Управление другой программой.
Вобщем встала передо мной задача создать приложение, которое будет перехватывать управление другой программой, например есть программа, на...

управление другой программой
подскажите пожалуйста возможно ли создать программу для управления другой программой допустим(есть игра сапёр возможно ли создать программу...

Управление другой программой
Подскажите инклуды\библиотеки для управления другими програмамми а что хочу делать шас напишу Я собераюсь внедрится в прогу клиент где...

24
 Аватар для stupidstudent
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
15.12.2012, 00:53  [ТС]
Студворк — интернет-сервис помощи студентам
Avazart, в том, что я с winapi никогда не работал. И пока мало что в нем понимаю. Не знаю какую информацию гуглить. Както так.

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так в чем сложность по хендлу сначало вызвать SetForegroundWindow() для передачи фокуса, а затем эмулировать keybd_event() нажатие клавиш ?
за keybd_event() спасибо.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.12.2012, 00:59
Ну вам же сказали что для начала надо дождаться пока программа запустится и только потом искать хендл.
Если не находит значит либо программа еще не запустилась либо не правильно указано имя окна.

Насчет CreateProcess

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Запуск
String cmd= "command.bat";
STARTUPINFO StartInfo= {sizeof(TStartupInfo)};
StartInfo.cb =  sizeof(StartInfo);
PROCESS_INFORMATION ProcInfo;
LPCTSTR s;
 
bool code=0;
code = CreateProcess(  NULL,
                       cmd.c_str(),
                       NULL,NULL,false,
                       NORMAL_PRIORITY_CLASS,
                       NULL,NULL,
                       &StartInfo,&ProcInfo );
 
if(code)
  {
  cout<<"Программа \""<<ExtractFileName(cmd).c_str()<<"\" запущена успешно"<<endl;
  }
Добавлено через 2 минуты
C++
1
Handle = FindWindow(NULL, "C:\\lol.exe");//  двойной слеш
1
 Аватар для stupidstudent
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
15.12.2012, 01:14  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
двойной слеш
уже давно исправил )

Цитата Сообщение от Avazart Посмотреть сообщение
Ну вам же сказали что для начала надо дождаться пока программа запустится и только потом искать хендл.
Программа запускается. Все дело оказалось в ShellExecute
Трабл, это режим запуска в SW_SHOWNORMAL, поставив SW_HIDE проблему решил.
Пойду высплюсь


CreateProcess
C++
1
2
3
4
STARTUPINFO StartInfo= {sizeof(TStartupInfo)};
StartInfo.cb =  sizeof(StartInfo);
PROCESS_INFORMATION ProcInfo;
LPCTSTR s;// а этого у вас нет
Этими данными можно какнить манипулировать(должно быть да)?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.12.2012, 01:54
То что дело в ShellExecute() и сразу было понятно только
Цитата Сообщение от stupidstudent Посмотреть сообщение
Трабл, это режим запуска в SW_SHOWNORMAL, поставив SW_HIDE проблему решил.
Только явно не в режиме, а в том что эта ф-ция попросту не ждет выполнения программы

Добавлено через 1 минуту
Цитата Сообщение от stupidstudent Посмотреть сообщение
Этими данными можно какнить манипулировать(должно быть да)?
Да пример есть в Архангельском только не помню точно в какой книге.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.12.2012, 15:03
Собственно надеялся на такую реализацию

C++
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
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String cmd= "cmd";
 
STARTUPINFO StartInfo= {sizeof(TStartupInfo)};
StartInfo.cb =  sizeof(StartInfo);
PROCESS_INFORMATION ProcInfo;
LPCTSTR s;
 
bool code=0;
code = CreateProcess(  NULL,
                                             cmd.c_str(),
                                             NULL,NULL,false,
                       NORMAL_PRIORITY_CLASS,
                                             NULL,NULL,
                                             &StartInfo,&ProcInfo );
 
 
DWORD dwWaitResult =WaitForInputIdle(ProcInfo.hProcess,5000); // Ждем инициализацию окна
 
if(!dwWaitResult)  ShowMessage("ошибка");
 
//WaitForSingleObject( ProcInfo.hProcess, INFINITE );// Пока не закроем окно консоли
 
HWND Handle = FindWindow(NULL, "Администратор: C:\\Windows\\system32\\cmd.exe");
 
if(Handle) ShowMessage("ok");
}
//---------------------------------------------------------------------------
Но собственно WaitForInputIdle с консольными приложениями работает не так как хотелось бы
Функция WaitForInputIdle дает возможность потоку приостановить свою работу по выполнению кода до тех пор, пока заданный процесс не закончил свою инициализацию и ждет ввод данных от пользователя без задержки ввода. Это может быть полезно для синхронизации родительского процесса и недавно созданного дочернего процесса. Когда родительский процесс создает дочерний процесс, функция CreateProcess возвращает значение, не ожидая, когда дочерний процесс закончить свою инициализацию. Перед попыткой установить связь с дочерним процессом, родительский процесс может использовать WaitForInputIdle, чтобы выявить, когда инициализация “ребенка” была завершена. Например, родительский процесс должен использовать WaitForInputIdle, перед попыткой найти окно, связанное с дочерним процессом.
Но
[in] Дескриптор процесса. . Если этот процесс - консольная программа или не имеет очереди сообщений, WaitForInputIdle возвращает значение немедленно.
http://vsokovikov.narod.ru/New... utidle.htm
http://msdn.microsoft.com/ru-r... 85%29.aspx
http://msdn.microsoft.com/ru-r... 85%29.aspx

Добавлено через 6 минут
Поэтому как-то так
C++
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
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String cmd= "cmd";
 
STARTUPINFO StartInfo= {sizeof(TStartupInfo)};
StartInfo.cb =  sizeof(StartInfo);
PROCESS_INFORMATION ProcInfo;
LPCTSTR s;
 
bool code=0;
code = CreateProcess(  NULL,
                                             cmd.c_str(),
                                             NULL,NULL,false,
                                             NORMAL_PRIORITY_CLASS,
                                             NULL,NULL,
                                             &StartInfo,&ProcInfo );
 
 
int attempt = 5; // пять попыток
 
HWND hWnd;
do
    {
     hWnd= FindWindow(NULL, "Администратор: C:\\Windows\\system32\\cmd.exe");
     Sleep(100);  // ждем 0,1 с
     attempt--;
    }
while(!hWnd && attempt );
 
if(Handle) ShowMessage("ok");
}
//---------------------------------------------------------------------------
Добавлено через 2 минуты
Если использовать CreateProcess() вместо ShellExecute(), то наверное надежнее искать окно по ID процесса или hProcess
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2012, 15:03

Управление другой программой
Доброго времени суток! У меня возник вопрос: можно ли средствами c++(или с помощью сторонних библиотек) управлять другой программой?...

управление другой программой
есть такая проблема: имеем 2 программы,допустим: в 1 программе есть button и edit во 2 программе есть button когда я наживаю на...

Управление другой программой
Есть сторонняя программа, в окне которой размещены различные элементы, которыми нужно управлять. Например ComboBox. Необходимо менять...

Управление другой программой
Возможно ли полностью управлять другой программой? Ну или эмулировать работу с другой программой? т.е. допустим у нас есть какая-то левая...

Управление другой программой.
Подскажите пожалуйста что мне следует прочесть/изучить чтоб уметь с пмощю шарпа управлять другой оконной программой??например, есть скайп,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru