Путь к исполняемому файлу от активного окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Путь к исполняемому файлу от активного окна

Сообщение Space » 23.07.2009 (Чт) 6:06

Как получить путь к исполняемому файлу проги, которая показывает активное в данный момент окно?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Путь к исполняемому файлу от активного окна

Сообщение Хакер » 23.07.2009 (Чт) 7:39

Получить хендл окна, получить идентификатор процесса, получить хендл (или облом, из-за нехватки прав) процесса, узнать имя файла.

В поиск!
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 24.07.2009 (Пт) 2:02

OpenProcess - с каким флагом dwDesiredAccess его лучше вызывать и что такое дескриптор наследования?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 24.07.2009 (Пт) 2:28

Вылетает ошибка - Параметр задан неверно.
Код: Выделить всё
    hActiveWnd = GetForegroundWindow
    StrangerTreadID = GetWindowThreadProcessId(hActiveWnd, 0)
    lRet = OpenProcess(PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION, 0, StrangerTreadID)
Debug.Print "Err.Description = "; GetErrorString(Err.LastDllError)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 24.07.2009 (Пт) 3:34

хендл процесса получил. Но теперь путь не выдаёт, хотя операция завершается успешно
Код: Выделить всё
    StrangerTreadID = GetWindowThreadProcessId(hActiveWnd, ProcessID)
    lRet = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
'Debug.Print "Err.Description = "; GetErrorString(Err.LastDllError)
    If lRet > 0 Then
     sTemp = Space(MAX_PATH)
     GetModuleFileName lRet, sTemp, Len(sTemp)

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 24.07.2009 (Пт) 23:21

есть кто в танке?

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Путь к исполняемому файлу от активного окна

Сообщение arvitaly » 24.07.2009 (Пт) 23:27

Примеров миллион, почему сам не ищешь?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 24.07.2009 (Пт) 23:45

Ну я же написал пример, почему не пашет? На дельфях и т.д. работает...

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Путь к исполняемому файлу от активного окна

Сообщение arvitaly » 25.07.2009 (Сб) 0:25

Код: Выделить всё
Public Function getForegroundHwndPathName() As String
Dim cbNeeded As Long
Dim Modules(1 To 200) As Long
Dim nSize As Long
Dim lRet As Long
Dim ModuleName As String
Dim hProcess As Long
Dim hwnd As Long, tid As Long, pid As Long

    hwnd = GetForegroundWindow 
    tid = GetWindowThreadProcessId(hwnd, pid)   
    If pid = 0 Then getForegroundHwndPathName = "[System Idle Process]": Exit Function
    If pid = 4 Then getForegroundHwndPathName = "[System]": Exit Function
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, pid)
    If hProcess <> 0 Then
        lRet = EnumProcessModules(hProcess, Modules(1), 200, cbNeeded)
        If lRet <> 0 Then
            ModuleName = Space(MAX_PATH)
            nSize = MAX_PATH
            lRet = GetModuleFileNameExA(hProcess, Modules(1), ModuleName, nSize)
            If CBool(InStr(1, (Left(ModuleName, lRet)), "", vbTextCompare)) Then
                getForegroundHwndPathName = Left(ModuleName, lRet)
            End If
        End If
    End If
    CloseHandle hProcess
End Function

[Viper] :: Для выделения кода есть специальный тэг code. Не забываем им пользоваться!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 25.07.2009 (Сб) 3:00

почему мой код не работает?

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Путь к исполняемому файлу от активного окна

Сообщение arvitaly » 25.07.2009 (Сб) 9:47

GetModuleFileName http://msdn.microsoft.com/en-us/library ... 85%29.aspx
The module must have been loaded by the current process.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 25.07.2009 (Сб) 15:16

1.А что это за модули такие у процесса?
2.Зачем читать 200 модулей, когда нужен и используется далее только один Modules(1)?
Код: Выделить всё
lRet = EnumProcessModules(hProcess, Modules(1), 200, cbNeeded)

3.что за сложная конструкция
Код: Выделить всё
If CBool(InStr(1, (Left(ModuleName, lRet)), "", vbTextCompare)) Then

чем не подходит просто
Код: Выделить всё
Left(ModuleName, lRet)
?

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Путь к исполняемому файлу от активного окна

Сообщение Space » 25.07.2009 (Сб) 22:52

есть кто в танке?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 19

    TopList