C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: как программно послать SIGINT в cmd.exe?  (Прочитано 2822 раз)
moskk
-Кто же это ходит за мёдом с воздушными шариками?
Участник


Сказали спасибо: +17/-4
Offline

Сообщений: 264

-Я хожу.


как программно послать SIGINT в cmd.exe?
« : 04 Февраль 2013, 13:01:25 »

https://cbuilder.ru/index.php/topic,9059.0.html

вот-с. а то что-то в той ветке жизни не чувствуется...
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как программно послать SIGINT в cmd.exe?
« Ответ #1 : 04 Февраль 2013, 14:51:41 »

А послать сочетание клавиш (Ctrl+C) в консоль не пробовал?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как программно послать SIGINT в cmd.exe?
« Ответ #2 : 04 Февраль 2013, 14:55:58 »

Еще тут предлагается юзать SetConsoleCtrlHandler:
Код
void SendControlC(int pid)
{
   AttachConsole(pid); // attach to process console
   SetConsoleCtrlHandler(NULL, TRUE); // disable Control+C handling for our app
   GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // generate Control+C event
}
 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как программно послать SIGINT в cmd.exe?
« Ответ #3 : 04 Февраль 2013, 15:04:42 »

Еще.
На худой конец - TerminateProcess.
Записан
moskk
-Кто же это ходит за мёдом с воздушными шариками?
Участник


Сказали спасибо: +17/-4
Offline

Сообщений: 264

-Я хожу.


Re: как программно послать SIGINT в cmd.exe?
« Ответ #4 : 04 Февраль 2013, 16:25:41 »

Цитата: S0mbre от 04 Февраль 2013, 14:51:41
А послать сочетание клавиш (Ctrl+C) в консоль не пробовал?
я пробовал так:
Код:
PostMessage(hCmdProc, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(hCmdProc, WM_KEYDOWN, 'С', 0);
PostMessage(hCmdProc, WM_KEYUP, 'С', 0);
PostMessage(hCmdProc, WM_KEYUP, VK_CONTROL, 0);
ничего не произошло. но hCmdProc - это хэндл процесса, а не окна. может быть, поэтому не получилось?

Цитата: S0mbre от 04 Февраль 2013, 14:55:58
Еще тут предлагается юзать SetConsoleCtrlHandler
тогда я этим хэндлером сам же и словлю Ctrl+C. в cmd ведь он не попадёт?

Цитата: S0mbre от 04 Февраль 2013, 15:04:42
На худой конец - TerminateProcess.
ну... можно, конечно, перезапустить cmd, это поможет. а больше никак нельзя?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: как программно послать SIGINT в cmd.exe?
« Ответ #5 : 05 Февраль 2013, 07:09:10 »

Цитата: moskk от 04 Февраль 2013, 16:25:41
Цитата: S0mbre от 04 Февраль 2013, 14:55:58
Еще тут предлагается юзать SetConsoleCtrlHandler
тогда я этим хэндлером сам же и словлю Ctrl+C. в cmd ведь он не попадёт?

Не должно быть, т.к. в приведенном коде:
Код
void SendControlC(int pid)
{
   AttachConsole(pid); // присоединить процесс (pid) к консоли
   SetConsoleCtrlHandler(NULL, TRUE); // отключить обработку Control+C для своего приложения
   GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // вызвать событие Control+C (=послать сигнал SIGINT)
}
 

Насколько я знаю (но может, ошибаюсь), сигналы напрямую в винде послать нельзя, только WinAPI. В UNIX - ноу проблем.
В приведенном коде pid - это идентификатор, а не дескриптор процесса. ЕГо можно получить, например, с помощью GetProcessID.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.114 секунд. Запросов: 20.