Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить имя exe-файла по дескриптору окна? сабж 
:(
    Опции темы
BreakPointMAN
Дата 21.6.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: нет
Всего: 24



Сразу оговорюсь: в поиске был, видел многие аналогичные темы...Однако по ряду причин я все же решил создать эту тему, ибо есть некоторые вопросы.

Итак, что нужно: зная дескриптор окна, получить имя файла (причем очень желательно с полным путем) процесса, которому данное окно принадлежит. При этом хотелось бы, чтобы код, решающий данную задачу, успешно работал как под линейкой Win9x, так и под линейкой WinNT.

Использую Borland C++ Builder 6. На данный момент я написал следующий код:
Код

AnsiString GetExecutableFileName(HWND hWnd)
   {
    AnsiString Result;

    // По переданному в функцию дескриптору окна получим идентификатор процесса
    DWORD idProcess;
    GetWindowThreadProcessId(hWnd, &idProcess);

    TProcessEntry32 pe; // в структуре хранится информация о процессе
    char ModName[MAX_PATH+1]; // имя файла модуля

    if (Win32Platform==VER_PLATFORM_WIN32_WINDOWS)
       {
        // Работаем в Win9x
        HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSnapshot!=INVALID_HANDLE_VALUE)
           {
            pe.dwSize=sizeof(pe);
            if (Process32First(hSnapshot, &pe))
               {
                do
                   {
                    if(pe.th32ProcessID==idProcess)
                       {
                        Result=pe.szExeFile;
                        break;
                       }
                   }
                while(Process32Next(hSnapshot, &pe));
               }
            CloseHandle(hSnapshot);
           }
       }
    else
       {
        // Работаем в WinNT/2000/XP
        HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                             false, idProcess);
        if (hProcess)
           {
            GetModuleFileNameEx(hProcess, NULL, ModName, sizeof(ModName));
            Result=ModName;
            CloseHandle(hProcess);
           }
       }
    return Result;
   }


Однако он меня не устраивает в полной мере. Во-первых, он определяет имена exe'шников не для всех окон, в частности не получилось это сделать с окном Антивируса Касперского - оканчивается неудачей вызов функции OpenProcess. Во-вторых, код, предназначенный для Win9x, возвращает только имена файлов, без пути (вообще-то, я тестировал его на Win2k, возможно на Win9x он поведет себя иначе - если кто-нибудь может, проверьте, пожалуйста). Код, приведенный здесь - Как получить имя файла данного дескриптора окна -  также заканчивается выводом имени файла, а не полного пути, однако он нормально сработал для Антивируса Касперского.

Ну и, собственно, вопросы... хотя какие вопросы? Проблему-то я, вообщем, обозначил... Хочется универсальности - раз, полный путь - два, и желательно, конечно, чтобы срабатывало для всех окон...  smile Если кто-то решал данную задачу, то поделитесь решением.

PS: есть замечательная программка InqSoft Window Scanner © CyberManiac , скачать ее можно отсюда: http://kickme.to/inqsoft, там эта задача, насколько я понимаю, решена внедрением DLL... 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
_hunter
Дата 21.6.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



тут получалка под NT
для прог, защищающихся от закрытия (в частности для касторского) придется перехватывать функцию OpenProcess 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
BreakPointMAN
Дата 23.6.2006, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: нет
Всего: 24



Цитата(_hunter @  21.6.2006,  10:29 Найти цитируемый пост)
тут получалка под NT

Не увидел по ссылке ничего для себя полезного, ибо в моем коде это все уже используется.

Цитата(_hunter @  21.6.2006,  10:29 Найти цитируемый пост)
для прог, защищающихся от закрытия (в частности для касторского) придется перехватывать функцию OpenProcess  

Можно немного подробнее? 


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
_hunter
Дата 23.6.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



вот:
http://forum.vingrad.ru/index.php?showtopic=11700
для 9х код...

Цитата(BreakPointMAN @  23.6.2006,  06:26 Найти цитируемый пост)
Можно немного подробнее? 

поиск "перехват API" 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.