Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Как получить имя exe-файла по дескриптору окна
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию Как получить имя exe-файла по дескриптору окна - 21.06.2006, 01:50

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

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

На данный момент я написал следующий код:
Код:
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 он поведет себя иначе - если кто-нибудь может, проверьте, пожалуйста). Код, приведенный здесь - Как получить имя файла данного дескриптора окна - также заканчивается выводом имени файла, а не полного пути, однако он нормально сработал для Антивируса Касперского.

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

PS: есть замечательная программка InqSoft Window Scanner © CyberManiac , скачать ее можно отсюда: http://kickme.to/inqsoft, там эта задача, насколько я понимаю, решена внедрением DLL...
Ответить с цитированием
  (#2 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 21.06.2006, 05:15

Каспер скорее исключение, чем правило. Далеко не всем нужно хукать OpenProcess
Ответить с цитированием
  (#3 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию 22.06.2006, 17:14

А как бороться вот с такими вот "исключениями"?
Ответить с цитированием
  (#4 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 23.06.2006, 06:59

Для случая каспера - пожалуй, лучше просто не пытаться его открыть...
Ответить с цитированием
  (#5 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию 23.06.2006, 15:25

Цитата:
Originally posted by Dian
[b]Для случая каспера - пожалуй, лучше просто не пытаться его открыть...
Ну а если все же очень хочется?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 23.06.2006, 15:43

подгрузить библиотеку и вызывать Application->ExeName()
Ответить с цитированием
  (#7 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию 23.06.2006, 15:47

Цитата:
Originally posted by Fuud
[b]подгрузить библиотеку и вызывать Application->ExeName()
А с какого боку тут объект Application и его свойство ExeName?..
Ответить с цитированием
  (#8 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 23.06.2006, 17:56

Application->ExeName() возвращает путь к приложению. Так что грузим библиотеку в поток окна и получаем путь.
Ответить с цитированием
  (#9 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию 23.06.2006, 18:33

Товарищ Fuud, что-то Вы не то говорите... какую библиотеку? какой поток окна? "Application->ExeName" вернет мне имя моего файла-exe'шника...
Ответить с цитированием
  (#10 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 23.06.2006, 18:53

Цитата:
Originally posted by BreakPointMAN
[b]Товарищ Fuud, что-то Вы не то говорите... какую библиотеку? какой поток окна? "Application->ExeName" вернет мне имя моего файла-exe'шника...
нет
Ответить с цитированием
  (#11 (permalink)) Старый
BreakPointMAN BreakPointMAN вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.06.2004
По умолчанию 23.06.2006, 19:16

Бррр, чур меня, чур...
Ответить с цитированием
  (#12 (permalink)) Старый
devel0per devel0per вне форума
Member
 
Сообщений: 55
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.09.2005
По умолчанию 23.06.2006, 19:20

Цитата:
Originally posted by BreakPointMAN
[b]"Application->ExeName" вернет мне имя моего файла-exe'шника...
Ты непонял, Fuud предлагает прописать это в коде длл
Цитата:
Originally posted by BreakPointMAN
[b]А как бороться вот с такими вот "исключениями"? :roll:
Панель управления -> Установка и удаление программ -> Касперский
После удаления проблема исчезнет
А если серьёзно, то советую попробовать внедрение длл...
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 24.06.2006, 14:18

Цитата:
Originally posted by BreakPointMAN
[b]Бррр, чур меня, чур...
Если не веришь - посмотри исходный код.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить путь активного окна Windows imported_Dozent Delphi 1 04.09.2007 15:35
Получить текст из чужого окна const WinAPI 2 17.08.2006 09:31
Получить хэндл окна без заголовка Lesat WinAPI 5 15.01.2006 20:36
Как получить видимый регион окна UFO WinAPI 3 04.01.2006 23:33
Как получить координаты чужого окна Talisman Delphi 9 06.12.2005 12:25
Как получить hWnd конкретного окна lord Visual C++ 1 03.10.2005 02:41
Как получить текущий каталог окна imported_Dima_ Вопросы начинающих программистов 8 30.01.2005 16:20
Как получить дескриптор диалогового окна BD Visual C++ 7 30.11.2004 18:01
Как получить дискриптор окна консольного приложения Anonymous C++ Builder 1 27.11.2003 18:04
Как получить имя окна программы Anonymous Visual C++ 1 21.07.2003 03:49
Как получить изображение окна другого приложения d!ma WinAPI 1 16.07.2003 21:12
Как получить список ресурсов окна Visual C++ Anonymous Visual C++ 1 03.07.2003 18:47



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов