Окна, процессы, потоки...
От: GarryFV  
Дата: 11.09.02 09:45
Оценка:
Никак не могу свести в кучу сии объекты .
В общем хочу "пообщаться" сообщениями с чужой программой, зная только название exe модуля.

При этом могу получить ModuleHandle=GetModuleHandle(<ExeName>),
но не знаю как получить Handle главного окна или потока .

Или могу взять список всех окон в системе(EnumWindows), но не могу узнать какому модулю принадлежит данное окно.

Полностью лопатить Win32 reference желания нет.
Может подскажет кто какие-нибудь функции?
Re: Окна, процессы, потоки...
От: sasha Грузия  
Дата: 11.09.02 10:33
Оценка:
Здравствуйте GarryFV, Вы писали:

GFV>Никак не могу свести в кучу сии объекты .

GFV>В общем хочу "пообщаться" сообщениями с чужой программой, зная только название exe модуля.

GFV>При этом могу получить ModuleHandle=GetModuleHandle(<ExeName>),

GFV>но не знаю как получить Handle главного окна или потока .

GetModuleHandle не будет работать с "чужой" программой, а только с модулями, загруженными в то же адр. пр-во.

GFV>Или могу взять список всех окон в системе(EnumWindows), но не могу узнать какому модулю принадлежит данное окно.

GFV>Полностью лопатить Win32 reference желания нет.
GFV>Может подскажет кто какие-нибудь функции?

Самым простым способом будет использовать FindWindow по заголовку или классу чужого окна
Re[2]: Окна, процессы, потоки...
От: GarryFV  
Дата: 11.09.02 11:04
Оценка:
Здравствуйте sasha, Вы писали:


S>GetModuleHandle не будет работать с "чужой" программой, а только с модулями, загруженными в то же адр. пр-во.


GFV>>Или могу взять список всех окон в системе(EnumWindows), но не могу узнать какому модулю принадлежит данное окно.


S>Самым простым способом будет использовать FindWindow по заголовку или классу чужого окна


Не было бы проблем , но я не знаю ни имени окна ни имени класса (посмотреть с помощью SPy++ не предлагать, т.к. прогу пишу не для себя). Я знаю только имя exe-шника.

Вот, например, как через имя "winamp.exe" — найти его главное окно и закрыть его.
Или как вообще закрыть его не находя главного окна.
Re[3]: Окна, процессы, потоки...
От: Kubyshev Andrey  
Дата: 11.09.02 11:33
Оценка:
Здравствуйте GarryFV, Вы писали:

GFV>Вот, например, как через имя "winamp.exe" — найти его главное окно и закрыть его.

GFV>Или как вообще закрыть его не находя главного окна.

nadeyus ty uzhe nashel kak poluchit' spisok processov ? Esli net, to poischi v MSDN "Taking a Snapshot and Viewing Processes". a esli da, do zakryt' winamp moznno TerminateProcess'om, predvaritelno otkryv ego OpenProcess'om
Re[4]: Окна, процессы, потоки...
От: GarryFV  
Дата: 11.09.02 12:18
Оценка:
Здравствуйте Kubyshev Andrey, Вы писали:

KA>Здравствуйте GarryFV, Вы писали:


GFV>>Вот, например, как через имя "winamp.exe" — найти его главное окно и закрыть его.

GFV>>Или как вообще закрыть его не находя главного окна.

KA>nadeyus ty uzhe nashel kak poluchit' spisok processov ? Esli net, to poischi v MSDN "Taking a Snapshot and Viewing Processes". a esli da, do zakryt' winamp moznno TerminateProcess'om, predvaritelno otkryv ego OpenProcess'om


Я так понял, что должен получить SnapShot, пройтись по списку процессов,а там в параметрах есть handle модуля процесса — получить ModuleFileName, сравнить с winamp.exe, и когда найду — сделать OpenProcess и TerminateProcess.

Интересно только все эти handle-ы чужих процессов будут правильными в моем адресном пространстве? Впрочем попробую...
Немного путаюсь в вещах типа Process Handle и ProcessID — редко приходится заниматься таким программингом (это я извиняюсь за ламерские вопросы

Спасибо большое за советы.

P.S. А все-таки нет другого способа имея HWND напрямую узнать какому exe это окно принадлежит?
Re[5]: Окна, процессы, потоки...
От: server_mouse Беларусь  
Дата: 12.09.02 05:57
Оценка:
Здравствуйте GarryFV, Вы писали:
GFV>P.S. А все-таки нет другого способа имея HWND напрямую узнать какому exe это окно принадлежит?

Это то как раз и можно!
HANDLE hProcess;
HMODULE hModule;
DWORD PID; //Process ID.
HWND hwnd; 

TCHAR sBuf[MAX_PATH];
TCHAR *sExe;
DWORD nModuleSizeNeed;

//Как-то определяем HWND, Например hwnd=::FindWindow(MY_WINDOW_CLASS,NULL);
GetWindowThreadProcessId(hwnd,&PID);
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,false,PID);
EnumProcessModules(hProcess,&hModule,sizeof(HMODULE), &nModuleSizeNeed);
if(GetModuleFileNameEx(hProcess,hModule,sBuf,sizeof(sBuf)))
{
   sExe = _tcsrchr(sBuf, _T('\\'));
   if(sExe==NULL) sExe = sBuf;
   else sExe++;
}
//В sEXE лежит имя *.exe.
//Целую кучу if() я опустил -- проверки на ошибки.  ;)


А вот обратное как раз и затруднительно...
Если человек программист, то это надолго.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.