Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Послать в окно другого процесса команду

26K
28 июня 2008 года
3D-GRAF
41 / / 28.06.2008
Здравствуйте, возникла следующая проблема. Необходимо на си реализовать отправку команды в другое окно. Т.е. запускаю программу, а она в свою очередь находит окно другого процесса и посылает туда команду quit. Т.к. всё время работал с PHP, тут встал в ступор. С си знаком очень мало, поиск ничего не дал. Нашёл функцию PostQuitMessage, вроде что-то похожее, но реализовать не смог. Просьба помочь, желательно с примером, а то пока что туго доходит :confused:
26K
28 июня 2008 года
3D-GRAF
41 / / 28.06.2008
На данный момент удалось только реализовать вот так:
 
Код:
PostMessage(FindWindow(NULL, "PROGRAMM1"), WM_CLOSE, 0, 0);


Но тогда, программа завершается не совсем корректно. Для корректного завершения, нужно вводить в неё команду quit, а вот как автоматизировать это на си, так и не нашел. Гуру, хелп!
26K
29 июня 2008 года
3D-GRAF
41 / / 28.06.2008
Пока что временно сделал тупую эмуляцию нажатий:

 
Код:
SetForegroundWindow(hwnd);
           
keybd_event('Q', 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event('U', 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event('I', 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event('T', 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
           
keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);


А как сразу команду quit отправить? Что, никто не знает или это невозможно?
3
29 июня 2008 года
Green
4.8K / / 20.01.2000
PostMessage(hwnd, WM_QUIT, 0, 0);

только так делать не стоит, корректнее закрывать главное окно приложения:

PostMessage(hwnd, WM_CLOSE, 0, 0);
26K
29 июня 2008 года
3D-GRAF
41 / / 28.06.2008
Повторюсь, мне нужно сообщить другому приложению именно команду quit (тогда перед закрытием, она делает некоторые нужные операции).
342
30 июня 2008 года
Yos
209 / / 21.06.2003
А зачем именно WM_QUIT - она же в окна не попадает, а ее контролит обработчик GetMessage. Лучше создайте свое сообщение типа WM_USER+N и его посылайте и обрабатываейте...

Когда то на заре так и делал, сейчас правда механизмы более сложные (как и проги :), но однозначно надежнее...
26K
30 июня 2008 года
3D-GRAF
41 / / 28.06.2008
Да что вы все на этот WM_QUIT кинулись? :)
Мне наоборот не подходит такой вариант, мне не закрыть приложение надо (WM_QUIT), а отправить в него команду quit (он её сам обработает). А как работает WM_USER вроде бы понял, но у меня нет возможности изменить исходный код приложения, в который quit надо отправить.
1.9K
30 июня 2008 года
max_dark
256 / / 11.11.2005
3D-GRAF забыл упомянуть, что ему нужно управлять консольным приложением. Я пытался сделать через перенаправление ввода/вывода, но получилось неособо.
7.3K
30 июня 2008 года
H010d Freeze
143 / / 08.08.2006
И все-таки, что же нужно сделать?
Если закрыть оконное приложение, то чем не устраивает
 
Код:
PostMessage(FindWindow(NULL, "PROGRAMM1"), WM_CLOSE, 0, 0);

Закрытие главное окна приложения (отправкой WM_CLOSE), на сколько я помню, приводит к тому, что в очередь постится WM_QUIT. Разве это не то, что нужно?

Если нужно закрыть консольное приложение, то можно попробовать покопать в MSDN, функция SetConsoleCtrlHandler, сам не пробовал, потому подробнее сказать не могу
1.9K
30 июня 2008 года
max_dark
256 / / 11.11.2005
Сэмулировать набор команды "quit" и нажатие enter-a
26K
30 июня 2008 года
3D-GRAF
41 / / 28.06.2008
Да, именно это и нужно... кроме конечно эмуляции нажатия каждой кнопки (как я писал выше)
26K
04 января 2009 года
3D-GRAF
41 / / 28.06.2008
Тема очень старая, но снова к ней возращаюсь.

У меня есть приложение, которому может передаваться аргумент на запуск или остановку процесса. Делаю запуск, требуется каким-то образом запомнить это приложение, вот как это сделать? узнать id процесса? как это сделать? возможно ли узнать id процесса, и по нему поменять заголовок окна?

P.S. Хотелось бы увидеть реальные примеры, т.к. с момента моих последних сообщение, знаний си у меня больше не стало :)
397
04 января 2009 года
SergPas
527 / / 03.02.2007
Цитата:
P.S. Хотелось бы увидеть реальные примеры, т.к. с момента моих последних сообщение, знаний си у меня больше не стало

Это мы бы хотели увидеть Ваш пример...

Цитата:
Делаю запуск, требуется каким-то образом запомнить это приложение, вот как это сделать? узнать id процесса? как это сделать? возможно ли узнать id процесса, и по нему поменять заголовок окна?

Интересно, какой функцией Вы запускаете другие приложения?
Достаточно воспользоваться функцией CreateProcess и в структуру PROCESS_INFORMATION запишется вся информация о созданном процессе. Из неё Вы извлечёте и идентификатор процесса, и идентификатор первичного потока, зная которые легко найти handle нужного окна и переименовать его.

26K
05 января 2009 года
3D-GRAF
41 / / 28.06.2008
Тем кто знает, наверное действительно легко, а мне после php как-то не особо :confused:

Пример:
 
Код:
CreateProcess(0, path, 0, 0, TRUE, HIGH_PRIORITY_CLASS, 0, 0, &cif, &pi);

SetWindowText(hwnd, argv[3]);


Вот собственно и весь пример, как в hwnd подставить хендл окна?
И ещё вопрос, после CreateProcess можно узнать путь файла этого процесса?
397
05 января 2009 года
SergPas
527 / / 03.02.2007
Цитата:
Вот собственно и весь пример, как в hwnd подставить хендл окна?

Здесь всё достаточно просто. В поле dwThreadId переменной pi структурного типа PROCESS_INFORMATION содержится идентификатор первичного потока. Далее вызываете функцию:

 
Код:
BOOL EnumThreadWindows(      
    DWORD dwThreadId,    
    WNDENUMPROC lpfn,    
    LPARAM lParam );
где lpfn - указатель на функцию обратного вызова (callback), которая получает хэндлы окон, связанных с потоком dwThreadId. В этой-то функции (lpfn) и должен изменяться заголовок окна(окон):
 
Код:
BOOL CALLBACK lpfn(HWND hwnd, LPARAM lParam)
{
    GetWindowText(hwnd, wndName, 256); //получить заголовок окна
    SetWindowText(hwnd, argv[3]); //изменить заголовок окна
    if (hwnd!=0)
       return true;
    else return false;
}
7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Зачем вызывать EnumThreadWindows?Если память мне ни с кем не изменяет,есть специальная функция,которая возвращает hWnd окна,созданного потоком.Возможно,я путаю её с GetWindowThreadProcessId(которая работает наоборот),но есть ещё функция GetGUIThreadInfo,которая в структуре возвращает информацию об окнах(а именно,их дескрипторы)
Цитата: 3D-GRAF
…после CreateProcess можно узнать путь файла этого процесса?

Не понял вопроса.Вызывая CreateProcess,ты передаёшь в неё имя файла(может,с путём,может,нет),а если ты имеешь в виду запускаемую программу,то в ней этот путь можно узнать через GetCurrentDirectory(если при вызове CreateProcess не было указано иначе и текущая папка не менялась),GetCommandLine и много-много других хороших функций:)

397
01 марта 2009 года
SergPas
527 / / 03.02.2007
Теме почти 2 месяца!!!:D
7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
С момента предыдущего ответа и месяца не прошло.Да и тема не молоко–не скиснет:)

P.S. На самом деел это жуткий оффтоп:D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог