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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

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

Сообщение brigval » 25.02.2006 (Сб) 0:54

Как определить путь к файлу, если имеем открытое окно?
brigval

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.02.2006 (Сб) 1:14

http://www.anekdot.ru/an/an0005/s000531.html, №72 писал(а):Вернулась пожилая учительница математики с курсов повышения
квалификации и решила первый урок провести по-новому, как на курсах
учили:
- Дети, давайте отойдем от старых методик и будем строить уроки иначе.
Вот, например. Посмотрите в окно. Видите, на ветке сидят 2 голубя и 4
воробья? Вопрос: сколько мне лет?
Класс обалдело молчит. Наконец Вовочка поднимает руку.
- Пятьдесят, - отвечает он.
- Правильно, - удивляется она. - А как ты это определил?
- У нас в доме живет парень один... Он полудурок...Так ему двадцать пять.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.02.2006 (Сб) 1:43

tyomitch, это не в тему. Видимо, автор хочет получить путь к EXE по hWnd окна. GetModuleFileName.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Сообщение brigval » 25.02.2006 (Сб) 8:32

tyomitch
С некоторых пор анекдоты про Вовочку в нашей стране не популярны :)

BV
Спасибо.
Для поиска имени нужного открытого окна я использую следующий код (часть кода)

Код: Выделить всё
lResult = GetWindowText(hwnd, sWndName, MAX_PATH)

После того как окно найдено, функция
Код: Выделить всё
Function ModuleName(ByRef hwnd As Long) As String
    Dim FileName As String, hInst As Long
    ModuleName = String$(128, Chr$(0))
    hInst = GetWindowWord(hwnd, GWW_HINSTANCE)
    ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))
End Function

выдает путь к мому исполняемому файлу, а не файла, который создал окно.
Что здесь может быть не так? Или, есть ли еще способы?
Пример я нашел в интернете.
GWW_HINSTANCE=-6
brigval

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.02.2006 (Сб) 8:42

Есть ещё способы. GetModuleFileNameEx (2k и выше).
А также CreateToolhelp32Snapshot с последующим перебором.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Сообщение brigval » 25.02.2006 (Сб) 9:12

GSerg писал(а):Есть ещё способы. GetModuleFileNameEx (2k и выше).
А также CreateToolhelp32Snapshot с последующим перебором.


Надо и для W98.
С помщью функции CreateToolhelp32Snapshot смог получить только имя EXE-файла. А нужен путь, для доступа к файлам из директории с EXE файлом.
Посмотрел еще в интернете... Пишут, что для 95/98/Me функция действительно выдает полный путь, а для NT только имя файла EXE :(
А задача должна решаться для W98...XP
brigval

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.02.2006 (Сб) 9:55

GetWindowsVersion
If <=98 then CreateToolhelp32Snapshot else GetModuleFileNameEx.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Сообщение brigval » 25.02.2006 (Сб) 9:57

GSerg писал(а):GetWindowsVersion
If <=98 then CreateToolhelp32Snapshot else GetModuleFileNameEx.

Я уж тоже начал приходить к этому решению :)

Большое спасибо.
brigval

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.02.2006 (Сб) 11:19

brigval писал(а):После того как окно найдено, функция
Код: Выделить всё
Function ModuleName(ByRef hwnd As Long) As String
    Dim FileName As String, hInst As Long
    ModuleName = String$(128, Chr$(0))
    hInst = GetWindowWord(hwnd, GWW_HINSTANCE)
    ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))
End Function

выдает путь к мому исполняемому файлу, а не файла, который создал окно.
Что здесь может быть не так? Или, есть ли еще способы?
Пример я нашел в интернете.
GWW_HINSTANCE=-6

Вас обманули.
MSDN писал(а):The GetWindowWord function is obsolete. It is provided only for compatibility with 16-bit versions of Windows. Win32-based applications should use the GetWindowLong function.



Зачем нужна GetModuleFileNameEx -- я не знаю. GetWindowModuleFileName работает в Win98+ без проблем.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.02.2006 (Сб) 18:11

brigval писал(а):Или, есть ли еще способы?


Код: Выделить всё
Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowModuleFileName Lib "user32.dll" Alias "GetWindowModuleFileNameA" (ByVal hwnd As Long, ByVal pszFileName As String, ByVal cchFileNameMax As Long) As Long

Private Sub Form_Load()
    Dim strModuleName As String * 255
    Dim hFWnd As Long
   
    Call Shell(Environ$("WinDir") & Chr$(92) & "calc.exe", vbNormalFocus)
    hFWnd = FindWindow(vbNullString, "Калькулятор")
    strModuleName = Left$(strModuleName, GetWindowModuleFileName(hFWnd, _
        strModuleName, Len(strModuleName)))
   
    MsgBox strModuleName
End Sub



2 tyomitch

Я API написал по памяти, ошибся.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Сообщение brigval » 25.02.2006 (Сб) 19:05

BV
К сожалению, пример с калькулятором выдает пустую строку. WinXP SP2 rus.
Да и в интернете однозачного отношения к GetWindowModuleFileName нет.

tyomitch
GetWindowLong не дало желаемого результата.

Видимо, вариант от GSerg

GetWindowsVersion
If <=98 then CreateToolhelp32Snapshot else GetModuleFileNameEx.

более надежный. И более для меня понятный.

Жаль, что попробовать в эти выходные не успел. Программирую на уровне любителя. Поэтому все незнакомое идет с большим трудом :(
brigval

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 25.02.2006 (Сб) 19:37

brigval писал(а):BV
К сожалению, пример с калькулятором выдает пустую строку. WinXP SP2 rus.
Да и в интернете однозачного отношения к GetWindowModuleFileName нет.


Ссылка
Столь длинные ссылки оформляем тэгами, дабы не разлезался топик.

Пример мой работает.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Сообщение brigval » 09.03.2006 (Чт) 23:24

Вариант от GSerg
Код: Выделить всё
GetWindowsVersion
If <=98 then CreateToolhelp32Snapshot else GetModuleFileNameEx.

работает как часы. Еще раз всем спасибо за помощь.
brigval


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

    TopList  
cron