На главную Наши проекты:
Журнал   ·   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.
  
> Работа с процессами
    Помогите, пожалуйста:
    Как узнать title приложения (который отображается в CAD'е)
    Сообщение отредактировано: v4ng3r -
      1. GetModuleFileName()
      2. GetSecurityInfo()
        GetModuleFileName - получения имени exe, а мне нужно получить title проги, который отображается при нажатии на CAD. Такой тайтл задаётся, например, Application.title
        GetSecurityInfo - чё ето? Никогда не слышал. Расскажи поподробнее.
          Ну тогда WM_GETTEXT правда применительно к какому хэндлу тут прямо и не скажешь.. :(
            Попробую wm_gettext, у меня ещё вся ночь впереди и пара бутылочек пивца :)
            И ещё вопрос: а что это за GetSecurityInfo ?
              Не знаю как к этому отнесутся, но все же лови:
              ExpandedWrap disabled
                <br>GetSecurityInfo<br>The GetSecurityInfo function retrieves a copy of the security descriptor for an object specified by a handle. <br><br>DWORD GetSecurityInfo(<br>  HANDLE handle,     // handle to the object<br>  SE_OBJECT_TYPE ObjectType,<br>                     // type of object<br>  SECURITY_INFORMATION SecurityInfo, <br>                     // type of security information to retrieve<br>  PSID *ppsidOwner,  // receives a pointer to the owner SID<br>  PSID *ppsidGroup,  // receives a pointer to the primary group SID<br>  PACL *ppDacl,      // receives a pointer to the DACL<br>  PACL *ppSacl,      // receives a pointer to the SACL<br>  PSECURITY_DESCRIPTOR *ppSecurityDescriptor<br>                     // receives a pointer to the security descriptor<br>);<br> <br>Parameters<br>handle <br>A handle to the object from which to retrieve security information. <br>ObjectType <br>Specifies a value from the SE_OBJECT_TYPE enumeration that indicates the type of object named by the pObjectName parameter. <br>SecurityInfo <br>A set of SECURITY_INFORMATION bit flags that indicate the type of security information to retrieve. This parameter can be a combination of the following values. Value Meaning <br>OWNER_SECURITY_INFORMATION If this flag is set, the ppsidOwner parameter receives the security identifier (SID) of the object's owner. <br>GROUP_SECURITY_INFORMATION If this flag is set, the ppsidGroup parameter receives the SID of the object's primary group.  <br>DACL_SECURITY_INFORMATION If this flag is set, the ppDacl parameter receives the object's discretionary access-control list (DACL). <br>SACL_SECURITY_INFORMATION If this flag is set, the ppSacl parameter receives the object's system access-control list (SACL).. <br><br><br>ppsidOwner <br>Pointer to a variable that receives a pointer to the owner SID in the security descriptor returned in ppSecurityDescriptor. The returned pointer is valid only if you set the OWNER_SECURITY_INFORMATION flag. This parameter can be NULL if you do not need the owner SID. <br>ppsidGroup <br>Pointer to a variable that receives a pointer to the primary group SID in the returned security descriptor. The returned pointer is valid only if you set the GROUP_SECURITY_INFORMATION flag. This parameter can be NULL if you do not need the group SID. <br>ppDacl <br>Pointer to a variable that receives a pointer to the DACL in the returned security descriptor. The returned pointer is valid only if you set the DACL_SECURITY_INFORMATION flag. This parameter can be NULL if you do not need the DACL. <br>ppSacl <br>Pointer to a variable that receives a pointer to the SACL in the returned security descriptor. The returned pointer is valid only if you set the SACL_SECURITY_INFORMATION flag. This parameter can be NULL if you do not need the SACL. <br>ppSecurityDescriptor <br>Pointer to a variable that receives a pointer to the security descriptor of the object. You must call the LocalFree function to free the returned buffer. <br>Return Values<br>If the function succeeds, the return value is ERROR_SUCCESS.<br><br>If the function fails, the return value is a nonzero error code defined in WINERROR.H. <br><br>Remarks<br>If the ppsidOwner, ppsidGroup, ppDacl, ppSacl parameters are non-NULL, and the SecurityInfo parameter specifies that they be retrieved from the object, those parameters will point to the corresponding parameters in the security descriptor returned in ppSecurityDescriptor.<br><br>To read the owner, group, or DACL from the object's security descriptor, the calling process must have been granted READ_CONTROL access when the handle was opened. To get READ_CONTROL access, the caller must be the owner of the object or the object's DACL must grant the access.<br><br>To read the SACL from the security descriptor, the calling process must have been granted ACCESS_SYSTEM_SECURITY access when the handle was opened. The proper way to get this access is to enable the SE_SECURITY_NAME privilege in the caller's current token, open the handle for ACCESS_SYSTEM_SECURITY access, and then disable the privilege.<br><br>QuickInfo<br>  Windows NT: Requires version 4.0 or later.<br>  Windows: Unsupported.<br>  Windows CE: Unsupported.<br>  Header: Declared in aclapi.h.<br>  Import Library: Use advapi32.lib.<br><br>See Also<br>Windows NT 4.0 Access Control Overview, Windows NT 4.0 Access-Control Functions, ACL, GetNamedSecurityInfo, LocalFree, SE_OBJECT_TYPE, SECURITY_DESCRIPTOR, SECURITY_INFORMATION, SetNamedSecurityInfo, SetSecurityInfo, SID <br><br>
                Функция не пашет под win9x, чтоли? Если да, то не подходит... Но всё равно спасибо!
                А где ты нарыл такую инфу?
                Сообщение отредактировано: v4ng3r -
                  В WinSDK
                    Цитата V4ng3R<RnD>, 22.03.03, 15:08:08
                    Помогите, пожалуйста:
                    1. Как узнать title процесса (который отображается в списке по ctrl+alt+del)


                    GetWindowText
                      Цитата Vasya2000, 23.03.03, 13:39:18
                      GetWindowText

                      Совершенно неправильно. GetWindowText() может использоваться только применительно к окнам своего процесса.
                      Сообщение отредактировано: Song -
                        Странно, но тем не менее у меня применительно к любым окнам в системе возвращается tittle...
                          Цитата V4ng3R<RnD>, 23.03.03, 03:45:23

                          А где ты нарыл такую инфу?

                          MSDN
                            Подождите! Во-первых, GetWindowText() позволяет получить caption любого окна по его хэндлу. Во-вторых, для тех, кто в танке: мне нужно получить title ПРОЦЕССА, а НЕ окна. В-третьих в WinSDK я нашёл следущее:
                            ===============================================================
                            Get Application Title    

                            Copies the application title to the specified buffer.

                            mov  ah, 16h            ; Windows multiplex function
                            mov  al, 8Eh             ; VM Title
                            mov  di, seg AppTitle  ; see below
                            mov  es, di
                            mov  di, offset AppTitle
                            mov  cx, Size          ; see below
                            mov  dx, 2              ; Get Application Title
                            int  2Fh
                            cmp  ax, 1
                            je   success

                            Parameters

                            AppTitle
                            Address of a buffer that receives the application title. This parameter must not be zero.

                            Size
                            Size, in bytes, of the buffer pointed to by AppTitle.

                            Return Value
                            Returns 1 in the AX register if successful or zero otherwise.

                            Remarks

                            Get Application Title copies as much of the title as possible, but never more than the specified number of bytes. The function always appends a terminating null character to the title in the buffer.
                            =================================================================
                            Я понял, что это и есть искомый способ, но
                            КАК этим пользоваться ???
                            Сообщение отредактировано: v4ng3r -
                              Вообщем понятно чего тебе надо. Здесь зависит от того какая ОС.
                              Если W9x, тогда юзай ToolHelp ф-ии, там есть параметр exe файл
                              Если NT, тогда или EnumProcesses(), или сразу NTQuerySystemInformation() (EnumProcesses использует последнюю)
                              Что касается асма, надо сначала Ring0 получать, чтобы иметь доступ к таким областям, иначе AV.
                                У меня win98


                                Цитата Song, 23.03.03, 20:09:20
                                Если W9x, тогда юзай ToolHelp ф-ии, там есть параметр exe файл

                                Поподробнее, что за функции

                                Цитата Song, 23.03.03, 20:09:20
                                Что касается асма, надо сначала Ring0 получать, чтобы иметь доступ к таким областям, иначе AV.

                                Как юзать AV?
                                Сообщение отредактировано: v4ng3r -
                                  Открываешь MSDN или Win SDK и ищешь CreateToolHelp functions
                                    Искал, в SDK нет ни одной функции, с помощью которой можно получить title процесса.
                                    Там указывается только код на асме, а как его юзать, я не понял :(
                                      Про r0 (для Windows 95/98/ME) есть пример в >FAQ< по асму (см. про резидент).
                                      А про GetWindowText ты не прав, Song. Он выдаёт название для любого процесса!
                                      Сообщение отредактировано: 7in -
                                        2 Jin X: GetWindowText НЕ ВЫДАЁТ title процесса!! >:(
                                        А на асм забейте, я его ещё не изучал и, видимо, нескоро буду :)
                                        Сообщение отредактировано: v4ng3r -
                                          Цитата V4ng3R<RnD>, 23.03.03, 22:34:29
                                          Искал, в SDK нет ни одной функции, с помощью которой можно получить title процесса.

                                          Что имеешь ввиду под "title процесса"?
                                          Сообщение отредактировано: .alex -
                                            О-о-о... :'( :)
                                            Блин, .alex, ты внимательно читал мессаги наверху? >:(
                                            Под titl'ом процесса я подразумеваю то что отображается при нажатии CAD.
                                            Запускаю Дельфя, пишу: application.Title:='dats ma pr0c355';
                                            Запускаю прогу, жму CAD, вижу строчку: "dats ma pr0c355".
                                            Всё просто :)
                                            Так вот, как получить такую строчку ???
                                              Блин! Да выдаёт GetWindowText title :)
                                              Попробуй сам:
                                              ExpandedWrap disabled
                                                procedure TForm1.FormCreate(Sender: TObject);<br>var<br>  Name: PChar;<br>begin<br>  Application.Title := 'Хрен собачий';<br>  ListBox1.Clear;<br>  GetMem(Name, 256);<br>  GetWindowText(Application.Handle, Name, 256);<br>  MessageBox(0, Name, 'Угадал?', mb_Ok + mb_IconInformation);<br>  FreeMem(Name, 256);<br>  Halt<br>end;
                                                Тогда почему не пашет следущее :( :

                                                ExpandedWrap disabled
                                                  <br>...<br>var<br>  Form1: TForm1;<br>  ProcEntry: tprocessentry32;<br>  hSnapShot,phndl: thandle;<br>  i: integer;<br>  pid: array[0..49] of cardinal;<br>  procid: cardinal;<br>  proctitle: pchar;<br><br>...<br><br>procedure TForm1.lstprocDropDown(Sender: TObject); [b]//всё тот же ComboBox[/b]<br>begin<br>hsnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br>procentry.dwSize:=sizeof(PROCESSENTRY32);<br>if Process32First(hsnapshot,Procentry) then<br>begin<br>  lstproc.Clear;<br>  i:=0;<br>  GetMem(proctitle, 256);<br>  with lstproc.Items do<br>  begin<br>    repeat<br>      pid[i]:=procentry.th32ProcessID;<br>      phndl:=OpenProcess(PROCESS_ALL_ACCESS,false,pid[i]);<br>      GetWindowText(phndl, proctitle, 256);<br>      Add(proctitle);<br>      closehandle(phndl);<br>      inc(i);<br>    until not Process32Next(hsnapshot,Procentry);<br>  end;<br>end;<br>FreeMem(proctitle, 256);<br>CloseHandle(hsnapshot);<br>end;<br>...<br>


                                                ??? ??? ??? :( :( :(
                                                Сообщение отредактировано: v4ng3r -
                                                  Скорее всего это ваще не работает
                                                  phndl:=OpenProcess(PROCESS_ALL_ACCESS,false,pid[i]);
                                                  GetWindowText(phndl, proctitle, 256);
                                                    А почему ???
                                                    Почему, когда передаёшь хэндл своего процесса, то всё получатся, а когда передаёшь хэндл чужого процесса, выдаётся пустая строка?
                                                    Кстати при перечислении процессов хэндл своего процесса (Application.Handle) сильно отличается от перечисляемого хэндла... О, идея, а может надо передавать хэндл модуля?.. Щас попробую.
                                                      Блин, не получилось >:( Я не могу получить хэндл модуля. GetModuleHandle возвращает, судя по WinSDK, хэндл только своего процесса.
                                                        V4ng3R<RnD>, по-моему я сказал как получить title.. ты читаешь постинги?
                                                        Забудьте про GetWindowText() или WM_GETTEXT, они возвращают строку с окна. Это прокатит только для окна объекта класса TApplication. В других программах такого окна нет, поэтому и возвращается пустая строка.
                                                          Цитата Song, 25.03.03, 12:06:05
                                                          ...по-моему я сказал как получить title.. ты читаешь постинги?...

                                                          Блин, конечно я читаю постинги, но, по-моему, ни один из предложенных способов не помогает! :( ToolHelp не помогает, кодом на асме я не знаю как пользоваться, GetModuleFileName выдаёт имя экзешника или прочего модуля, а не title.
                                                          Блин, хэлп ми !! :'(
                                                            Покажи как ты ToolHelp используешь.
                                                              Троеточием обозначены пропуски кода
                                                              ...
                                                              uses
                                                               ..., TlHelp32;
                                                              type
                                                               Tfmain = class(TForm)
                                                                 ...
                                                                 lstProcs: TListBox;
                                                                 cTimer: TTimer;
                                                                 ...
                                                                 procedure cTimerTimer(Sender: TObject);
                                                                 procedure FormCreate(Sender: TObject);
                                                                 ...
                                                              ...
                                                              var
                                                               fmain: Tfmain;
                                                               hsnapshot,...: thandle;
                                                               procentry: tprocessentry32;
                                                               pid: array[0..49] of cardinal;
                                                               ppath: array[0..49] of ansistring;
                                                               i,...: integer;

                                                              implementation

                                                              procedure ListProcs;
                                                              begin
                                                              ...
                                                              hsnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
                                                              procentry.dwSize:=sizeof(PROCESSENTRY32);
                                                              if Process32First(hsnapshot,procentry) then
                                                              begin
                                                               fmain.lstprocs.Clear;
                                                               i:=0;
                                                               with fmain.lstProcs.Items do
                                                              {Здесь в lstProcs (ListBox) в цикле дожны
                                                              перечисляться titl'ы процессов}

                                                               begin
                                                                 repeat
                                                                   with procentry do
                                                                   begin
                                                                     pid[i]:=th32ProcessID;
                                                                     ppath[i]:=szExeFile;
                                                                   end;
                                                                   Add(ExtractFileName(ppath[i]));
                                                                   inc(i);
                                                                 until not Process32Next(hsnapshot,procentry);
                                                               end;
                                                              end;
                                                              CloseHandle(hsnapshot);
                                                              ...
                                                              end;
                                                              {$R *.dfm}
                                                              ...
                                                              procedure Tfmain.cTimerTimer(Sender: TObject);
                                                              begin
                                                              listprocs;
                                                              end;

                                                              procedure Tfmain.FormCreate(Sender: TObject);
                                                              begin
                                                              listprocs;
                                                              ...
                                                              end;
                                                              ...
                                                              С помощь ToolHelp'а я перечисляю процессы и получаю их id'ы.
                                                              И что ты хотел увидеть?
                                                              :-/
                                                              Сообщение отредактировано: v4ng3r -
                                                                Ау, 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 -
                                                                                              2e-yes: это в принципе неправильный код! Почитай мессаги повыше.

                                                                                              А насчёт кнопки на таскбаре... Не знаю, может быть... Ладно, я завтра пороюсь, сообщу результаты.
                                                                                                Цитата V4n93R<RnD>, 14.04.03, 14:43:39
                                                                                                2e-yes: это в принципе неправильный код! Почитай мессаги повыше.

                                                                                                Думаешь я не читал?
                                                                                                  По ходу дела __alex всё-таки был прав.
                                                                                                  Смотрите. Я заношу в массив хэндлы всех окон, а затем начинаю поиск всех процессов. Для каждого процесса перебираю все окна и сравниваю id их владельцев (GetWindowThreadProcessId) со значением ProcessID найденного процесса. Если совпадение найдено и окно видимое, вывожу GetWindowText последнего в списке совпавшего окна (вернее первого, но я начинаю поиск с конца), иначе вывожу с заглавной буквы имя файла процесса (без расширения).
                                                                                                  Я сравнивал результат работы этой программы со списком, вызываемым по Ctrl-Alt-Del. Всё совпадает. Отличия небольшие:
                                                                                                  [*] У меня нет Explorer
                                                                                                  [*] У меня Winoa386, а у него - Winoldap
                                                                                                  [*] У него нет Kernel32, Msgsvr32, mmtask, Mprexe
                                                                                                  [*] Список в другом порядке :)

                                                                                                  Вот код.
                                                                                                  Необходимо создать кнопку Button1 и список ListBox1.

                                                                                                  ExpandedWrap disabled
                                                                                                    var<br>  Win: array [1..1024] of DWord;<br>  WC: DWord;<br>  i: DWord;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br><br> function EnumWindowsProc(H, LP: DWord): Boolean; stdcall;<br> begin<br>   Inc(WC);<br>   Win[WC] := H;<br>   EnumWindowsProc := True<br> end;<br><br>var<br>  TH, P: DWord;<br>  PE: TProcessEntry32;<br>  Found, Ok: Boolean;<br>  Title: PChar;<br><br>begin<br>  GetMem(Title, 4096);<br>  ListBox1.Clear;<br>  WC := 0;<br>  EnumWindows(@EnumWindowsProc, 0);<br>  TH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);<br>  Found := Process32First(TH, PE);<br>  while Found do<br>  begin<br>    Ok := False;<br>    for i := WC downto 1 do<br>    begin<br>      GetWindowThreadProcessId(Win[i], @P);<br>      if IsWindowVisible(Win[i]) and (P = PE.th32ProcessID) then<br>      begin<br>        Ok := True;<br>        Break<br>      end<br>    end;<br>    if Ok then<br>    begin<br>      GetWindowText(Win[i], Title, 4096);<br>      Ok := (Title[0] <> #0)<br>    end;<br>    if not Ok then<br>    begin<br>      StrPCopy(Title, ExtractFileName(PE.szExeFile));<br>      (StrEnd(Title)-Length(ExtractFileExt(PE.szExeFile)))^ := #0;<br>      StrLower(Title+1)<br>    end;<br>    ListBox1.Items.Add(Title);<br>    Found := Process32Next(TH, PE)<br>  end;<br>  CloseHandle(TH);<br>  FreeMem(Title, 4096)<br>end;

                                                                                                    о небольших отличиях:
                                                                                                    Цитата
                                                                                                    У меня Winoa386, а у него - Winoldap

                                                                                                    если глянуть версию файла winoa386.exe, то InternalName=WINOLDAP.
                                                                                                    Цитата
                                                                                                    У него нет Kernel32, Msgsvr32, mmtask, Mprexe

                                                                                                    ну и правильно - это же список задач а не процессов ;) если в своей проге вызвать RegisterServiceProcess, то и она исчезнет из это списка.

                                                                                                    но и кнопку на таскбаре тоже надо учесть - все же в списке задач (как в win9x, так и в winnt+) отображается не заголовок окна, а текст этой кнопки.
                                                                                                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                                                    0 пользователей:


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