Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];

Вниз

Как послат message   Найти похожие ветки 

 
Borys   (2003-02-17 11:36) [0]

Как послат message процессу без окна, известен PID.


 
Digitman   (2003-02-17 11:53) [1]

процессу нельзя послать сообщение

сообщение можно послать кодовому потоку процесса (если известен ThreadId - см. PostThreadMessage()) или окнам (см. PostMessage, SendMessage и т.п.)


 
Digitman   (2003-02-17 12:00) [2]

иными словами, знание PID процесса для адресации сообщений недостаточно.

необходимо, зная PID, найти ThreadID нужного код.потока целевого процесса (в контексте каждого стартуемого процесса Win32 автоматически создает как минимум один - основной - код.поток) и только после этого, получив ThreadId, посылать сообщение

перечислить код.потоки процесса можно с пом. ф-ции NtQuerySystemInformation либо с пом. ф-ций Thread32First/Next из состава ToolHelp32-интерфейса


 
Borys   (2003-02-17 12:47) [3]

спасибо


 
Borys   (2003-02-17 14:46) [4]

Еще вопрос.
Все работает но как только я запускаю приложение как сервис то не работает говорит не верный идентификатор


 
Digitman   (2003-02-17 15:14) [5]


> запускаю приложение как сервис


Какое приложение ?


> говорит не верный идентификатор


Кто говорит ? Кому ?

В "угадайку" будем играть сейчас)))


 
Borys   (2003-02-17 15:22) [6]

Я написал приложение которое может работать как сервис и просто как консольное приложение. И другое приложение которое управляет первым. Когда запускаю его как приложение то второе приложение может ему посылать сообщения (PostThreadMessage) а если запускаю как сервис не может говорит не верный идентификатор Thread уже пробовал посылать всем Thread связанных с этим процессом.


 
Digitman   (2003-02-17 16:21) [7]

ну и как ты определяешь целевой ThreadId в приложении, которое должно по этому ThreadId сообщения слать ? Код покажи


 
Borys   (2003-02-17 16:29) [8]

hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapshot = INVALID_HANDLE_VALUE then begin
exit;
end;
Entry.dwSize := sizeof(Entry);
if not(PROCESS32First(hSnapshot, Entry)) then begin
CloseHandle(hSnapshot);
exit;
end;
// Ищу вначале процесс по имени
repeat
R:="";
for i:=0 to MAX_PATH-1 do begin
if Entry.szExeFile[i]=#0 then break;
if Entry.szExeFile[i]="\" then begin
R:="";
j:=0;
continue;
end;
R:=R+Entry.szExeFile[i];
end;
//Нашли процесс ищем Thread
if R=PrName then begin
Result:=0;
CloseHandle(hSnapshot);
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, Entry.th32ProcessID);
Entry1.dwSize := sizeof(Entry1);
if not(THread32First(hSnapshot, Entry1)) then begin
CloseHandle(hSnapshot);
exit;
end;
i:=0;
repeat
//здесь смотрю ThreadID а так как их несколько (у меня 3 шт.)
//то из внешнего цикла выбираю их все по порядку (но никому
//не посылается
if Entry1.th32OwnerProcessID=Entry.th32ProcessID then begin
//Нашли нужный Thread
Result:=Entry1.th32ThreadID;
inc(i);
if i=Number then begin
break;
end;
end;
Entry1.dwSize := sizeof(Entry1);
until not(THread32Next(hSnapshot, Entry1));
CloseHandle(hSnapshot);
exit;
end;
Entry.dwSize := sizeof(Entry);
until not(PROCESS32Next(hSnapshot, Entry));


 
Digitman   (2003-02-17 16:49) [9]

во-первых, ToolHelp32-интерфейс не подходит для поиска процесса, зарегистрированного при старте как сервис-процесс

пользуйся для этого NtQuerySystemInformation()

во-вторых, ты занимаешься ерундой

зарегистрируй в обоих приложениях при старте некое именованное Win-сообщение (см. RegisterWindowMessage) и посылай на здоровье сообщения в любом направлении. Главное - создать в приложении-приемнике сообщения окно верхнего уровня, тогда приложение-передатчик сможет послать это сообщение (см. SendMessage(HWND_BROADCAST..)) всем верхнеуровневым окнам системы, но отреагирует на него лишь приложение-приемник, ибо оно зарегистрировало код именованного сообщения и заинтересовано в его приеме


 
Borys   (2003-02-17 17:26) [10]

А как в сервисе зарегистрировать окно верхнего уровня, он же без окон.


 
Digitman   (2003-02-17 17:36) [11]


> Borys


Как в сервисе, так и не в сервисе - обычный вызов CreateWindow[Ex]



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
14-30530
Nox
2003-03-24 10:49
2003.04.10
Visual Assembler


3-30299
Doom
2003-03-20 08:19
2003.04.10
Добавление объекта OLE в MS ACCESS


1-30430
MachmuD
2003-03-31 10:02
2003.04.10
Нужна помощь, каким образом нарисовать кривую


3-30315
Горец
2003-03-24 01:51
2003.04.10
Связь БД с Excel...


14-30545
S-S
2003-03-13 15:08
2003.04.10
Двухмиониторное отображение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский