Получить HWND вызывающей программы / вызываемой программы - PullRequest
1 голос
/ 03 ноября 2010

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

После запуска моей детской программы, как она может получить HWND для вызывающей программы? Есть ли функция, которую я могу вызвать, чтобы сделать это, или я могу сделать это косвенно, например, получить идентификатор процесса вызывающей программы, а затем перейти от него к HWND?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Есть небольшая проблема.Одна вызывающая программа может иметь несколько HWND из нескольких окон.И нет, я боюсь, что нет способа получить PID вызывающей программы или что-то подобное.Нет способа получить «родительский» процесс вашего процесса, по крайней мере, в Windows.Вы ничего не можете сделать, не зная имени вызывающей функции, тогда вы можете найти ее PID и получить список ее активных окон.

Я предлагаю работать в обратном направлении, передавая HWND вызывающего процесса в качестве командыПараметр линии к вашей программе.Например, «Запустите YourProgram.exe / hwnd: 1234»

РЕДАКТИРОВАТЬ: Я только что обнаружил, что есть способ, но просто не поставляется Windows.http://www.codeproject.com/KB/threads/ParentPID.aspx.Но есть одна оговорка.PID генерируются и перерабатываются постоянно, поэтому, если вы получите PID, нет гарантии, что его родитель не умер (сбой или завершение процесса) и PID используется чем-то другим.Тогда взаимодействие с предполагаемым родительским процессом станет очень опасным и нестабильным.Так что да, вы можете сделать это.Но будьте осторожны, если родительский сбой и вы пытаетесь получить к нему доступ через его старый PID, вы столкнетесь с серьезными проблемами, особенно если вы случайно внедрили что-то, скажем, в хост службы Windows.

2 голосов
/ 03 ноября 2010

WM_COPYDATA - довольно жалкий способ взаимодействия, учитывая необходимость найти правильный дескриптор окна.Тем не менее, ничего полезного не произойдет, если другая программа не будет активно сотрудничать с вашей, в противном случае она собирается выбросить сообщение WM_COPYDATA в мусорное ведро.Поскольку этой программе уже нужно много знать о вас, в том числе о том, где ее найти и обрабатывать сообщение, она также может просто предоставить вам аргумент командной строки, содержащий то, что вам нужно.

Да, дескриптор окна можно передать в качестве аргумента командной строки, вы получите его из main () или GetCommandLine () в дочернем процессе.

Рассмотрите именованный канал илисокет как лучшая мышеловка.Или вне процесса COM.

2 голосов
/ 03 ноября 2010

Пусть самое первое сообщение, отправленное запускающей программой, будет HWND, чтобы ребенок знал, кому отправить.

...