
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Ау, Song !!!
|
Сообщ.
#32
,
|
|
|
Цитата V4ng3R<RnD>, 29.03.03, 15:36:03 Ау, Song !!! Что ты от меня хочешь? |
Сообщ.
#33
,
|
|
|
Посмотри пару постингов назад, ты писал: "Покажи как ты используешь ToolHelp". Ты, наверно, хотел посмотреть и что-то сказать, или как? Ты не помнишь, бухой что ли был?
![]() |
Сообщ.
#34
,
|
|
|
Цитата V4ng3R<RnD>, 29.03.03, 22:30:23 Ты не помнишь, бухой что ли был? ![]() Не исключено. ![]() Гляну когда время будет. |
Сообщ.
#35
,
|
|
|
![]() |
Сообщ.
#36
,
|
|
|
может я че не понял, но имхо винды отображают title процессов так: если процесс имеет окно, то отображается его заголовок; если окон нет (или они невидимые) - то имя .exe-файла (без расширения).
посему здесь надо поступить так (подходит для любых виндов): 1. получить ProcessID процесса, котором мы интересуемся 2. далее надо узнать, есть ли у него окна. причем нас интересуют только видимые окна: ![]() ![]() <br>// вместо FindWindow("Progman",NULL); но это не важно ;)<br>HWND hWndDesktop=GetShellWindow();<br>DWORD dwprid, dwthrid;<br>// ищем первое окно<br>HWND hwnd=GetWindow(hWndDesktop, GW_HWNDFIRST);<br><br>while(true){<br> if(IsWindowVisible(hwnd) && hwnd!=hWndDesktop){<br> // по найденному окну получаем ProcessID процесса, которому<br> // это окно принадлежит. сравниваем PID c PID нашего процесса.<br> dwthrid=GetWindowThreadProcessId(hwnd, &dwprid);<br> if(dwpid==dwProcessID){<br> // найденное окно принадлежит тому самому процессу.<br> // просто берем его заголовок - это и будет title процесса.<br> GetWindowText(hwnd, ...);<br> break;<br> }<br> }<br> // ищем след. окно<br> hwnd=GetWindow(hwnd, GW_HWNDNEXT);<br>}<br> 3. ну а если окон у процесса нет - то юзаем ToolHelp-функции (которые не работают, к сожалению, на NT4). получаем имя .exe (или не .exe)-файла процесса, обрезаем расширение - title процесса готов! |
Сообщ.
#37
,
|
|
|
Нет, ты не прав. К сожалению
![]() Злополучный title задаётся, например, апи-функцией SetWindowText(phndl,"Я заголовок. Догадайся, как меня получить"); где phndl - хэндл процесса. Причём процесса только того, из которого функция вызывается, с чужим такие дела не проходят ![]() ![]() И title - не обязательно caption окна или название exeшника без расширения, он может быть каким угодно (каким задавали кодеры). Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как? |
Сообщ.
#38
,
|
|
|
Не надо грязи, для GetWindowText монопенисуально чужой процесс или свой.
ЗЫ. И код верный, у меня такой же. |
Сообщ.
#39
,
|
|
|
Цитата V4ng3R<RnD>, 10.04.03, 19:29:06 Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как? Ну так ставь в чем проблема ![]() |
Сообщ.
#40
,
|
|
|
Цитата V4ng3R<RnD>, 10.04.03, 19:29:06 Нет, ты не прав. К сожалению ![]() Злополучный title задаётся, например, апи-функцией SetWindowText(phndl,"Я заголовок. Догадайся, как меня получить"); где phndl - хэндл процесса. Причём процесса только того, из которого функция вызывается, с чужим такие дела не проходят ![]() ![]() И title - не обязательно caption окна или название exeшника без расширения, он может быть каким угодно (каким задавали кодеры). Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как? Угадай, какой у проги стал title после этого кода: ![]() ![]() <br>::SetWindowText( (HWND)GetCurrentProcess(), "123" );<br> Правильный ответ: остался таким же, как и был. |
Сообщ.
#41
,
|
|
|
Цитата e-yes, 11.04.03, 12:45:25 Не надо грязи, для GetWindowText монопенисуально чужой процесс или свой Тогда почему же следущий код выдаёт пустое сообщение вместо "Delphi 7": ========================================================= ========================================================= hsnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); procentry.dwSize:=sizeof(PROCESSENTRY32); if Process32First(hsnapshot,procentry) then begin repeat if procentry.szExeFile='мой_путь_к_delphi32.exe' then begin phndl:=openprocess(process_all_access,false,procentry.th32ProcessID); GetWindowText(phndl,ptitle,sizeof(ptitle)); closehandle(phndl); showmessage(ptitle); end; until not Process32Next(hsnapshot,procentry); end; CloseHandle(hsnapshot); ========================================================= ========================================================= а если передавать application.handle вместо phndl, то выводится свой title И нифига: setwindowtext(application.Handle,'123'); меняет title на "123" toZveruga: а ты поподробней расскажи, как это сделать... Что в библиотечке писать, например? |
Сообщ.
#42
,
|
|
|
Мдя, тяжело с вами, дельфистами, это сколько ж мне надо выкурить 1; , шоб преобразовать дескриптор процесса в дескриптор окна??
Ладно, посмотри в справке, что из себя application.handle представляет. Наверняка хендл главного окна:) |
Сообщ.
#43
,
|
|
|
1. В эту функцию можно передавать хэндл процесса вместо хэндла окна. Только проходит почему-то только со своим окном/процессом. :'(
2. Да нифига. application.handle - это хэндл... э-э-э... приложения. Непонятно, что это, но пашет ![]() Блин я зае... задолбался ![]() ![]() Ну хоть кто-нибудь мне поможет ??? :'( :'( |
Сообщ.
#44
,
|
|
|
Тебе __alex пять(!) дней назад дней написал _готовый_ код. И правильный. Почему бы не портировать на паскаль и не попробовать, прежде чем говорить что код не работает?
Посмотри пример, который я приводил, RTFM MSDN, не работает SetWindowText с хендлами процессов! |
Сообщ.
#45
,
|
|
|
кажется я начинаю понимать суть дела
![]() а суть в том, что Application.Handle возвращает нэндл (HWND) окна, но не самого окна приложения, а ЕГО КНОПКИ на таскбаре!! поэтому SetWindowText или Application.Title:='new title' меняют только надпись на этой кнопке, а не титл окна. и в Менеджере Задач или в списке по CAD высвечивается именно это. поэтому, если у нас есть злополучный хэндл, то вызываем GetWindowText и дело в шляпе! ;D встает другой вопрос - как получить хэндл этой самой кнопки? я не нашел этого в msdn, а насколько понятно из встроенного дебагера delphi, Application.Handle не вызывает сразу какую-либо api-функцию, а просто мувит заранее сохраненный хэндл... разглядывать же всю прогу в ida мне очень не хочется ![]() |