Послать в окно другого процесса команду
Но тогда, программа завершается не совсем корректно. Для корректного завершения, нужно вводить в неё команду quit, а вот как автоматизировать это на си, так и не нашел. Гуру, хелп!
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 отправить? Что, никто не знает или это невозможно?
только так делать не стоит, корректнее закрывать главное окно приложения:
PostMessage(hwnd, WM_CLOSE, 0, 0);
Когда то на заре так и делал, сейчас правда механизмы более сложные (как и проги :), но однозначно надежнее...
Мне наоборот не подходит такой вариант, мне не закрыть приложение надо (WM_QUIT), а отправить в него команду quit (он её сам обработает). А как работает WM_USER вроде бы понял, но у меня нет возможности изменить исходный код приложения, в который quit надо отправить.
Если закрыть оконное приложение, то чем не устраивает
Закрытие главное окна приложения (отправкой WM_CLOSE), на сколько я помню, приводит к тому, что в очередь постится WM_QUIT. Разве это не то, что нужно?
Если нужно закрыть консольное приложение, то можно попробовать покопать в MSDN, функция SetConsoleCtrlHandler, сам не пробовал, потому подробнее сказать не могу
У меня есть приложение, которому может передаваться аргумент на запуск или остановку процесса. Делаю запуск, требуется каким-то образом запомнить это приложение, вот как это сделать? узнать id процесса? как это сделать? возможно ли узнать id процесса, и по нему поменять заголовок окна?
P.S. Хотелось бы увидеть реальные примеры, т.к. с момента моих последних сообщение, знаний си у меня больше не стало :)
Это мы бы хотели увидеть Ваш пример...
Интересно, какой функцией Вы запускаете другие приложения?
Достаточно воспользоваться функцией CreateProcess и в структуру PROCESS_INFORMATION запишется вся информация о созданном процессе. Из неё Вы извлечёте и идентификатор процесса, и идентификатор первичного потока, зная которые легко найти handle нужного окна и переименовать его.
Пример:
SetWindowText(hwnd, argv[3]);
Вот собственно и весь пример, как в hwnd подставить хендл окна?
И ещё вопрос, после CreateProcess можно узнать путь файла этого процесса?
Здесь всё достаточно просто. В поле dwThreadId переменной pi структурного типа PROCESS_INFORMATION содержится идентификатор первичного потока. Далее вызываете функцию:
DWORD dwThreadId,
WNDENUMPROC lpfn,
LPARAM lParam );
{
GetWindowText(hwnd, wndName, 256); //получить заголовок окна
SetWindowText(hwnd, argv[3]); //изменить заголовок окна
if (hwnd!=0)
return true;
else return false;
}
Не понял вопроса.Вызывая CreateProcess,ты передаёшь в неё имя файла(может,с путём,может,нет),а если ты имеешь в виду запускаемую программу,то в ней этот путь можно узнать через GetCurrentDirectory(если при вызове CreateProcess не было указано иначе и текущая папка не менялась),GetCommandLine и много-много других хороших функций:)
P.S. На самом деел это жуткий оффтоп:D