Отправка произвольного сигнала в Windows?

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

find | grep '^\./ABC'

... и заменив ABC своим текстом.

Чтобы понять команду, давайте разберем ее немного:

  • find перечисляет все файлы в текущем каталоге и его подкаталогах; использование одного только перечислит все там. Обратите внимание, что find выводит каждый файл или каталог, начиная с ./, указывая, что их путь относительно текущего каталога. Знать об этом важно, потому что это означает, что мы будем искать результаты, начиная с ./ABC, а не только с ABC.

  • Символ канала | перенаправляет вывод одной команды другой, в этом случае вывод find перенаправляется на grep. Это называется трубопроводами.

  • grep берет выходные данные и фильтрует их, используя заданный шаблон, ^\./ABC.

    • Обратите внимание, что шаблон заключен в одинарные кавычки ' ', чтобы не допустить интерпретации оболочкой специальных символов внутри него.
  • Теперь сам шаблон записывается в определенном синтаксисе, называемом регулярным выражением или регулярным выражением для краткости. Regex - чрезвычайно мощный инструмент поиска, если вы освоите его, и есть сайты, такие как , , которые более подробно рассказывают вам об этом, но обратите внимание, что grep не является полноценным движком регулярных выражений, и вы не может делать все с этим.

  • Для нашей цели:

    • ^ в регулярном выражении соответствует началу строки; это предотвращает сопоставление с шаблоном, если он не встречается в начале имени файла.

    • . в регулярном выражении также имеет особое значение: оно означает «соответствовать любому отдельному символу здесь». Если вы хотите использовать его как буквальную точку, вам придется «экранировать» его, используя обратную косую черту \ перед ним. (Да, совпадение с любым символом в нашем случае было бы безвредно, но я сделал это ради полноты.)

28
задан 26.09.2008, 18:09

5 ответов

Если то, что Вы хотите, должно явно/программируемо закрыть другую программу какого-либо вида, в SysInternals' pstools существует мелкий инструмент, названный "pskill", который ведет себя точно так же, как Unixen "уничтожение" сделал бы.

, Если Вы хотите что-то еще, продолжайте читать (хотя я могу быть неправ в некоторых специфических особенностях ниже - это были эры, так как я в последний раз разработал Windows-программу в C использование только WinAPI и превосходных книг Charles Petzold, "Программирующих для Windows" как руководство).

В Windows у Вас правильно нет "сигналов", что функционирует, WinMain и WinProc получают от Операционной системы, прост сообщения . Например, при нажатии на кнопку "X" окна Windows отправляет обработчику тех окон сообщение WM_CLOSE. Когда удаленное окно, но все еще выполнение программы, это отправляет WM_DESTROY. Когда это собирается выйти из основного сообщения, обрабатывающего цикл, WinMain (не WinProc) получает WM_QUIT. Ваша программа должна ответить на все они как ожидалось - можно на самом деле разработать "unclosable" приложение, не делая то, что она должна после получения WM_CLOSE.

, Когда пользователь выбирает задачу из Windows Task Manager и нажимает "End Task", OS отправит WM_CLOSE (и другой я не помню). При использовании "Процесса Конца", тем не менее, процесс уничтожается непосредственно, никакие сообщения, отправленные когда-либо (источник: Старая Новая Вещь

, который я помню, был способ получить HWND окна другого процесса, как только Вы добираетесь, тот другой процесс мог отправить тому окну сообщение через функции PostMessage и DispatchMessage.

13
ответ дан 14.10.2019, 14:58

Можно также использовать jconsole для просмотра stacktrace всех рабочих потоков. Это будет работать над Windows и любой другой ОС, которая поддерживает Java. jconsole также имеет много других хороших функций, графиков памяти, графиков CPU, и т.д.

Он не отвечает на Ваш исходный вопрос, но надо надеяться позволяет Вам получать те же результаты.

, Если Ваш не знакомый с jconsole, проверьте Используя документацию JConsole .

1
ответ дан 14.10.2019, 14:58

В Windows все вращается вокруг сообщений Win32. Я не верю, что для этого есть инструмент командной строки, но в C ++ вы можете использовать FindWindow для отправки произвольного сообщения в другую программу Windows. например :

#define WM_MYMSG  ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
    ::PostMessage(h, WM_MYMSG, 0, 0);
}

Это также можно сделать в C # с помощью com-взаимодействия.

3
ответ дан 14.10.2019, 14:58

Windows не является POSIX. Это не имеет сигналов. Единственные 'сигналы', что консольные программы добираются, состоят в том, если они звонят SetConsoleCtrlHandler, в этом случае это может быть уведомлено, что пользователь нажал Ctrl+C, Ctrl+Break, закрыл консоль, вышел из системы или завершил работу системы.

Все остальное сделано с IPC, обычно с сообщениями окна или RPC. Проверьте документацию Sun, чтобы видеть, существует ли способ сделать то, что Вы спрашиваете относительно Windows JRE.

8
ответ дан 14.10.2019, 14:58

Мне просто интересно, поможет ли вам PsTools из, теперь принадлежащего Microsoft, SysInternals .

0
ответ дан 14.10.2019, 14:58

Теги

Похожие вопросы