Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: имя файла Добавлено: 14.02.04 00:18  

Автор вопроса:  ZoomerSD | ICQ: 148640473 
вопрос: как мне получить полное имя файла и путь до него, зная hWnd его окна?

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 14.02.04 02:30

Сначала находишь номер модуля (hInstance), а потом по нему уже и имя модуля.

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

Private Declare Function GetWindowWord Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long) As Integer

Const GWW_HINSTANCE = (-6)

Private Sub Form_Load()

'KPD-Team 2000

'URL: http://www.allapi.net/

'E-Mail: KPDTeam@Allapi.net

Dim ModuleName As String, FileName As String, hInst As Long

'create a buffer

ModuleName = String$(128, Chr$(0))

'get the hInstance application:

hInst = GetWindowWord(Me.hwnd, GWW_HINSTANCE)

'get the ModuleFileName:

'enter the following two lines as one, single line:

ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))

'set graphics mode to persistent

Me.AutoRedraw = True

'show the module filename

Me.Print "Module Filename: " + ModuleName

End Sub

Ответить

Номер ответа: 2
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #2 Добавлено: 14.02.04 16:09

я что-то не разобрался, но почему у меня вот в таком коде, имя файла всегда vb6.exe, хотя активное окно, окно IE например.

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function GetWindowWord Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
Const GWW_HINSTANCE = (-6)
Private Declare Function GetForegroundWindow Lib "user32" () As Long


Private Sub Form_Load()
Me.Hide
Timer1.Interval = 3000
End Sub

Private Sub Timer1_Timer()
Dim WindowhWnd As Long
WindowhWnd = GetForegroundWindow
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim ModuleName As String, FileName As String, hInst As Long
    'create a buffer
    ModuleName = String$(128, Chr$(0))
    'get the hInstance application:
    hInst = GetWindowWord(WindowhWnd, GWW_HINSTANCE)
    'get the ModuleFileName:
    'enter the following two lines as one, single line:
    ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))
    'set graphics mode to persistent
    Me.AutoRedraw = True
    'show the module filename
    Me.Print "Module Filename: " + ModuleName
Timer1.Interval = 0
Me.Show

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 15.02.04 03:18

Вот эта фигня по идее вообще не должна работать.

ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName)))   

Ответить

Номер ответа: 4
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #4 Добавлено: 15.02.04 10:24

    у меня не прокатывает вот в этой строке,

hInst = GetWindowWord(WindowhWnd, GWW_HINSTANCE)

точнее басик ошибки не выдаёт, но фнкция возвращает ноль или по другому говоря ошибку. А вобще, мне кажеться, чтопример неполный,  после " 'get the ModuleFileName:" напрашиваеться ещё одна строка, правда я незнаю, какая.

Ответить

Номер ответа: 5
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #5
Добавлено: 16.02.04 03:51

Уже не первый раз замечаю нерабочий код в этом Api-Guide.

Ну да пусть валяется. Авось пригодится.

===

GetWindowWord

The GetWindowWord function is obsolete. The GWW_ values are not supported. Win32-based applications should use the GetWindowLong function.

 

Ответить

Номер ответа: 6
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #6 Добавлено: 16.02.04 17:08

даже если использовать GetWindowLong, толку нету,остаёться пустой буфер и всё:(

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 16.02.04 21:31

Гм, у меня GetWindowLong выдает hInstance моего приложения, а не владельца окна... Где-то когда-то я слышал, что многие API-функции разрешают работать только со своими окнами, может, и зедсь так?

Ответить

Номер ответа: 8
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #8 Добавлено: 16.02.04 21:40

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

Ответить

Номер ответа: 9
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 17.02.04 00:05

Помочь могу немногим, разме что вот чем:

http://www.relib.com/forums/topic.asp?id=746083

и вот чем (посмотри, может, устроит):

Private Declare Function GetWindowModuleFileName Lib "user32.dll" Alias "GetWindowModuleFileNameA" (ByVal hWnd As Long, ByVal pszFileName As String, ByVal cchFileNameMax As Long) As Long

Private Const GCL_HICON As Long = -14

Private Declare Function GetClassLong Lib "user32.dll" Alias "GetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long

Private Declare Function DrawIcon Lib "user32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long

Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Const HWND_TOPMOST = -1

Const SWP_NOSIZE = &H1

Const SWP_NOMOVE = &H2

Const SWP_NOACTIVATE = &H10

Const SWP_SHOWWINDOW = &H40

Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)

Private Sub Form_Activate()

SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE

End Sub

Private Sub Command1_Click()

Dim s As String

h& = GetForegroundWindow()

s = String(255, 0)

GetWindowModuleFileName ByVal h&, ByVal s, ByVal 255&

ic& = ExtractIcon(ByVal App.hinstance, ByVal s, ByVal 0&)

Me.Cls

DrawIcon ByVal Me.hdc, ByVal 5&, ByVal 5&, ByVal ic&

ic& = GetClassLong(ByVal h&, GCL_HICON)

DrawIcon ByVal Me.hdc, ByVal 50&, ByVal 5&, ByVal ic&

CloseHandle ByVal ic&

End Sub

Private Function ParseNull(s As String) As String

ParseNull = Left(s, InStr(s, Chr(0)) - 1)

End Function

Private Sub Timer1_Timer()

Command1_Click

End Sub

Ответить

Номер ответа: 10
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #10
Добавлено: 17.02.04 01:25

2 Sharp

У меня GetWindowLong возвращает разные значения для разных hWnd.

2 zoomersd

Скорее всего он не работает с OLE-строками. Попробуй в качестве буфера указать байтовый массив.

Ответить

Номер ответа: 11
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #11 Добавлено: 17.02.04 19:47

to CyRax , поподробнее пожалуйста про байтовый массив,  как его использовать?

to All а в других языках программировани это кто-нибудь встречал?

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 17.02.04 19:51

Объявляешь байтовый массив:

Dim a(255) As Byte

Передаешь адрес его первого (вернее, нулевого) элемента функции:

Func a(0)

Если написать Func ByVal a(0), то VB передаст значение a(0), а если просто a(0), то он передаст его адрес. Элементы байтового массива расположены в памяти один за другим, что делает их хорошими заменителями строк, однако их использование сопряжено с определенными трудностями с переводом в строки.

Ответить

Номер ответа: 13
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #13 Добавлено: 17.02.04 20:50

и всё-равно непонятно, я к сожалению в байтах как свинья в апельсинах, поэтому можно пожалуйста почётче и желательно с примером

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 18.02.04 00:41

К сожалению готового примера у меня нет. А делать влом.

Попробуй объявить массив байт разрешением скажем в 250 и передай вместо строки в вызываемую функцию первый байт массива:

ДИМ Массив(250) Аз Байт

Функция Параметр1,Массив(0), Параметр2,... ПараметрН.

Ответить

Номер ответа: 15
Автор ответа:
 ZoomerSD



ICQ: 148640473 

Вопросов: 135
Ответов: 270
 Профиль | | #15 Добавлено: 18.02.04 22:14

тоесть у меня код в итоге должен выглядеть вот так:

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function GetWindowWord Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
Const GWW_HINSTANCE = (-6)
Private Declare Function GetForegroundWindow Lib "user32" () As Long


Private Sub Form_Load()
Me.Hide
Timer1.Interval = 3000
End Sub

Private Sub Timer1_Timer()
Dim WindowhWnd As Long
WindowhWnd = GetForegroundWindow
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim ModuleName(255) As Byte, FileName As String, hInst As Long
    'create a buffer
    'ModuleName = String$(128, Chr$(0))
    'get the hInstance application:
    hInst = GetWindowWord(WindowhWnd, GWW_HINSTANCE)
    'get the ModuleFileName:
    'enter the following two lines as one, single line:
    GetModuleFileName hInst, ModuleName(0), 255
    'set graphics mode to persistent
    Me.AutoRedraw = True
    'show the module filename
    Me.Print "Module Filename: " + CStr(ModuleName(0))
Timer1.Interval = 0
Me.Show
End Sub
или я опять где-то лапухнулся или  ModuleName(0) возвращает 0 

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам