На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Получить имя программы по заголовку окна
    Доброго времени суток всем!
    Как получить имя исполняемого файла, если известен заголовок (или хэндл) окна? В частности - необходимо получить иконку приложения. Делаю так, но он не работает:

    var
    wnd : HWnd;
    inst: HInst;
    buf: array [0..MAX_PATH] of char;

    begin
    wnd:=FindWindow(nil,'Блокнот');
    if wnd=0 then ShowMessage('No window');
    inst:=GetWindowLong(wnd, GWL_HINSTANCE);
    if inst=0 then ShowMessage('No Instance');
    GetModuleFileName(inst, buf, MAX_PATH);
    Caption:=buf;
    end;

    Так как же быть? Не подскажете?
      Сразу извиняюсь за длину...
      #include <windows.h>
         #include <stdio.h>
         #include <string.h>

         #define Key "SOFTWARE\\Microsoft\\Windows
         NT\\CurrentVersion\\Perflib\\009"

         void GetIndex( char *, char * );
         void DisplayFilename( DWORD );

         /********************************************************************\

         * Function: void main( )                                             *
         *                                                                    *
         * Purpose : Application entry point                                  *
         *                                                                    *
         
         void main( )
         {
            HWND                      hWnd;
            DWORD                     dwActiveProcessId;

            // Get window handle of Program Manager's main window.

            hWnd = FindWindow( "Progman", NULL );

            // Get PID of Program Manager.

            GetWindowThreadProcessId( hWnd, &dwActiveProcessId );

            // Display name of Program Manager's executable file.

            printf( "Searching for filename of Program Manager...\n" );
            DisplayFilename( dwActiveProcessId );
         }

         /********************************************************************\
         * Function: void DisplayFilename( DWORD )                            *

         *                                                                    *
         * Purpose : Display executable filename of the process whose PID     *
         *           is passed in as a parameter.                             *
         *                                                                    *
         * Comment : The information is retrieved from the performance        *
         *           data in the registry.                                    *
         *                                                                    *

         
         void DisplayFilename( DWORD dwProcessId )
         {
            DWORD                     CurrentProcessId;
            BOOL                      bContinue = TRUE;
            char                      szIndex[256] = "";
            DWORD                     dwBytes = 12000;
            DWORD                     dwProcessIdOffset;
            int                       i;

            PPERF_DATA_BLOCK          pdb;
            PPERF_OBJECT_TYPE         pot;
            PPERF_INSTANCE_DEFINITION pid;
            PPERF_COUNTER_BLOCK       pcb;

            PPERF_COUNTER_DEFINITION  pcd;

            // Get the index for the PROCESS object.
            GetIndex( "Process", szIndex );

            // Get memory for PPERF_DATA_BLOCK.
            pdb = (PPERF_DATA_BLOCK) HeapAlloc( GetProcessHeap(),
                                                HEAP_ZERO_MEMORY,
                                                dwBytes);

            // Get performance data.
            while( RegQueryValueEx(HKEY_PERFORMANCE_DATA, (LPTSTR)szIndex, NULL,
                                   NULL, (LPBYTE)pdb, &dwBytes) ==

         ERROR_MORE_DATA )
            {
               // Increase memory.
               dwBytes += 1000;

               // Allocated memory is too small; reallocate new memory.
               pdb = (PPERF_DATA_BLOCK) HeapReAlloc( GetProcessHeap(),
                                                     HEAP_ZERO_MEMORY,
                                                     (LPVOID)pdb,
                                                     dwBytes);
            }

            // Get PERF_OBJECT_TYPE.
            pot = (PPERF_OBJECT_TYPE)((PBYTE)pdb + pdb->HeaderLength);

            // Get the first counter definition.
            pcd = (PPERF_COUNTER_DEFINITION)((PBYTE)pot + pot->HeaderLength);

            // Get index value for ID_PROCESS.
            szIndex[0] = '\0';
            GetIndex( "ID Process", szIndex );

            for( i=0; i< (int)pot->NumCounters; i++ )
            {
               if (pcd->CounterNameTitleIndex == (DWORD)atoi(szIndex))
               {
                  dwProcessIdOffset = pcd->CounterOffset;
                  break;
               }

               pcd = ((PPERF_COUNTER_DEFINITION)((PBYTE)pcd + pcd->ByteLength));

            }

            // Get the first instance of the object.
            pid = (PPERF_INSTANCE_DEFINITION)((PBYTE)pot + pot-
         >DefinitionLength);

            // Get the name of the first process.
            pcb = (PPERF_COUNTER_BLOCK) ((PBYTE)pid + pid->ByteLength );
            CurrentProcessId = *((DWORD *) ((PBYTE)pcb + dwProcessIdOffset));

            // Find the process object for PID passed in, then print its
            // filename.

            for( i = 1; i < pot->NumInstances && bContinue; i++ )

            {
               if( CurrentProcessId == dwProcessId )
               {
                  printf( "The filename is %ls.exe.\n",
                          (char *) ((PBYTE)pid + pid->NameOffset) );
                  bContinue = FALSE;
               }
               else
               {
                  pid = (PPERF_INSTANCE_DEFINITION) ((PBYTE)pcb + pcb-
         >ByteLength);
                  pcb = (PPERF_COUNTER_BLOCK) ((PBYTE)pid + pid->ByteLength);
                  CurrentProcessId = *((DWORD *)((PBYTE)pcb +
         dwProcessIdOffset));

               }
            }
            if( bContinue == TRUE )
               printf( "Not found.\b" );

            // Free the allocated memory.
            if( !HeapFree(GetProcessHeap(), 0, (LPVOID)pdb) )
               printf( "HeapFree failed in main.\n" );

            // Close handle to the key.
            RegCloseKey( HKEY_PERFORMANCE_DATA );
         }

         /********************************************************************\
         * Function: void GetIndex( char *, char * )                          *
         *                                                                    *

         * Purpose : Get the index for the given counter                      *
         *                                                                    *
         * Comment : The index is returned in the parameter szIndex           *
         *                                                                    *
         
         void GetIndex( char *pszCounter, char *szIndex )
         {
            char*  pszBuffer;
            char*  pszTemp;
            char   szObject[256] = "";
            DWORD  dwBytes;
            HANDLE hKeyIndex;

            int    i = 0;
            int    j = 0;

            // Open the key.
            RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                          Key,
                          0, KEY_READ,
                          &hKeyIndex );

            // Get the size of the counter.
            RegQueryValueEx( hKeyIndex,
                             "Counters",
                             NULL, NULL, NULL,
                             &dwBytes );

            // Allocate memory for the buffer.
            pszBuffer = (char *) HeapAlloc( GetProcessHeap(),

                                            HEAP_ZERO_MEMORY,
                                            dwBytes );

            // Get the titles and counters.
            RegQueryValueEx( hKeyIndex,
                             "Counters",
                             NULL, NULL,
                             (LPBYTE)pszBuffer,
                             &dwBytes );

            // Find the index value for PROCESS.
            pszTemp = pszBuffer;

            while( i != (int)dwBytes )
            {
               while (*(pszTemp+i) != '\0')

               {
                  szIndex[j] = *(pszTemp+i);
                  i++;
                  j++;
               }
               szIndex[j] = '\0';
               i++;
               j = 0;
               while (*(pszTemp+i) != '\0')
               {
                  szObject[j] = *(pszTemp+i);
                  i++;
                  j++;
               }
               szObject[j] = '\0';
               i++;
               j = 0;
               if( *(pszTemp+i) == '\0' )
                  i++;
               if( strcmp(szObject, pszCounter) == 0 )
                  break;

            }

            // Deallocate the memory.
            HeapFree( GetProcessHeap(), 0, (LPVOID)pszBuffer );

            // Close the key.
            RegCloseKey( hKeyIndex );
         }
        Мда... Клево, конечно... Попытаюсь портировать на Делфи своими силами. А нельзя пример на Делфи? Тут вроде про него форум. wink.gif
          Я просто хотел показать набор необходимых апишных процедур... rolleyes.gif
            Спасибо, конечно, огромное, но пока у меня не все портируется... Может руки кривы, а может - С надо было лучше изучать... Блин, помогите на Дельфи сделать! Хто-нить! Song? Vit? Вы наверняка знаете или даже уже делали не раз..
              ZShell
              Надо исользовать GetWindowModuleFileName()
                О! Живые люди... biggrin.gif Пойду пробовать...
                  О! Нашел:

                  UINT GetWindowModuleFileName(
                  HWND hwnd,
                  LPTSTR lpszFileName,
                  UINT cchFileNameMax );

                  Функция записывает в буфер, определенный параметром lpszFileName, полный путь (содержащий имя файла) к файлу модуля, ассоциированного с указанным дескриптором окна.
                  В качестве результата функция возвращает количество символов TCHARs записанных в буфер.

                  Параметр
                  Описание

                  hWnd [in]
                  Дескриптор окна.

                  lpszFileName [out]
                  Указатель на буфер, в который будет записан путь и имя файла.

                  cchFileNameMax [in]
                  Определяет максимальное количество символов TCHARs, которые будут скопированы в буфер.

                  Просто в Дельфи 3 ее нету (или я плохо искал?) smile.gif
                    А вот и сладкий пинок в живот biggrin.gif :
                    #7 11.09.02 20:19:48 ты сам писал:
                    Сабж применяется только для окон своего процесса. Для других смотрите NTQuerySystemInformation()!

                    Но GetWindowModuleFileName действительно реально работает, всем спасибо! smile.gif
                      AttachThreadInput - и это уже будет твоё окно smile.gif
                        Интересный способ... Я не догадался процесс приатачить.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0333 ]   [ 16 queries used ]   [ Generated: 27.04.24, 12:12 GMT ]