На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (4) 1 2 [3] 4  все  ( Перейти к последнему сообщению )  
> Работа с процессами
    Ау, Song !!!
      Цитата V4ng3R<RnD>, 29.03.03, 15:36:03
      Ау, Song !!!

      Что ты от меня хочешь?
        Посмотри пару постингов назад, ты писал: "Покажи как ты используешь ToolHelp". Ты, наверно, хотел посмотреть и что-то сказать, или как? Ты не помнишь, бухой что ли был? :D
          Цитата V4ng3R<RnD>, 29.03.03, 22:30:23
          Ты не помнишь, бухой что ли был? :D

          Не исключено. :)
          Гляну когда время будет.
            :) окей
              может я че не понял, но имхо винды отображают title процессов так: если процесс имеет окно, то отображается его заголовок; если окон нет (или они невидимые) - то имя .exe-файла (без расширения).
              посему здесь надо поступить так (подходит для любых виндов):
              1. получить ProcessID процесса, котором мы интересуемся
              2. далее надо узнать, есть ли у него окна. причем нас интересуют только видимые окна:

              ExpandedWrap disabled
                <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 процесса готов!
              Сообщение отредактировано: __alex -
                Нет, ты не прав. К сожалению :(
                Злополучный title задаётся, например, апи-функцией SetWindowText(phndl,"Я заголовок. Догадайся, как меня получить"); где phndl - хэндл процесса. Причём процесса только того, из которого функция вызывается, с чужим такие дела не проходят :( А также не проходит обратный процесс - getwindowtext чужого процесса :(
                И title - не обязательно caption окна или название exeшника без расширения, он может быть каким угодно (каким задавали кодеры).

                Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как?
                  Не надо грязи, для GetWindowText монопенисуально чужой процесс или свой.

                  ЗЫ. И код верный, у меня такой же.
                    Цитата V4ng3R<RnD>, 10.04.03, 19:29:06
                    Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как?

                    Ну так ставь в чем проблема :). WH_CBT и можно получать title любого GUI приложения
                      Цитата V4ng3R<RnD>, 10.04.03, 19:29:06
                      Нет, ты не прав. К сожалению :(
                      Злополучный title задаётся, например, апи-функцией SetWindowText(phndl,"Я заголовок. Догадайся, как меня получить"); где phndl - хэндл процесса. Причём процесса только того, из которого функция вызывается, с чужим такие дела не проходят :( А также не проходит обратный процесс - getwindowtext чужого процесса :(
                      И title - не обязательно caption окна или название exeшника без расширения, он может быть каким угодно (каким задавали кодеры).

                      Слушайте, а может можно поставить хук или вживить dll'ку в чужой процесс, которая бы получала как бы "свой" title? Если это можно, может быть кто-нибудь подскажет, как?


                      Угадай, какой у проги стал title после этого кода:
                      ExpandedWrap disabled
                        <br>::SetWindowText( (HWND)GetCurrentProcess(), "123" );<br>


                      Правильный ответ: остался таким же, как и был.
                        Цитата 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: а ты поподробней расскажи, как это сделать... Что в библиотечке писать, например?
                        Сообщение отредактировано: v4ng3r -
                          Мдя, тяжело с вами, дельфистами, это сколько ж мне надо выкурить 1; , шоб преобразовать дескриптор процесса в дескриптор окна??
                          Ладно, посмотри в справке, что из себя application.handle представляет. Наверняка хендл главного окна:)
                            1. В эту функцию можно передавать хэндл процесса вместо хэндла окна. Только проходит почему-то только со своим окном/процессом. :'(
                            2. Да нифига. application.handle - это хэндл... э-э-э... приложения. Непонятно, что это, но пашет :)

                            Блин я зае... задолбался >:( :)
                            Ну хоть кто-нибудь мне поможет ??? :'( :'(
                            Сообщение отредактировано: v4ng3r -
                              Тебе __alex пять(!) дней назад дней написал _готовый_ код. И правильный. Почему бы не портировать на паскаль и не попробовать, прежде чем говорить что код не работает?

                              Посмотри пример, который я приводил, RTFM MSDN, не работает SetWindowText с хендлами процессов!
                                кажется я начинаю понимать суть дела  ;)
                                а суть в том, что Application.Handle возвращает нэндл (HWND) окна, но не самого окна приложения, а ЕГО КНОПКИ на таскбаре!!
                                поэтому SetWindowText или Application.Title:='new title' меняют только надпись на этой кнопке, а не титл окна. и в Менеджере Задач или в списке по CAD высвечивается именно это. поэтому, если у нас есть злополучный хэндл, то вызываем GetWindowText и дело в шляпе!  ;D
                                встает другой вопрос - как получить хэндл этой самой кнопки? я не нашел этого в msdn, а насколько понятно из встроенного дебагера delphi, Application.Handle не вызывает сразу какую-либо api-функцию, а просто мувит заранее сохраненный хэндл... разглядывать же всю прогу в ida мне очень не хочется :)
                                Сообщение отредактировано: __alex -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 2 [3] 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0406 ]   [ 15 queries used ]   [ Generated: 18.07.25, 04:08 GMT ]