Страница: 1 | 2 |
Сначала находишь номер модуля (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 я что-то не разобрался, но почему у меня вот в таком коде, имя файла всегда 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 Sub Timer1_Timer() Вот эта фигня по идее вообще не должна работать. ModuleName = Left$(ModuleName, GetModuleFileName(hInst, ModuleName, Len(ModuleName))) у меня не прокатывает вот в этой строке, hInst = GetWindowWord(WindowhWnd, GWW_HINSTANCE) точнее басик ошибки не выдаёт, но фнкция возвращает ноль или по другому говоря ошибку. А вобще, мне кажеться, чтопример неполный, после " 'get the ModuleFileName:" напрашиваеться ещё одна строка, правда я незнаю, какая. Уже не первый раз замечаю нерабочий код в этом Api-Guide. Ну да пусть валяется. Авось пригодится. === The GetWindowWord function is obsolete. The GWW_ values are not supported. Win32-based applications should use the GetWindowLong function. даже если использовать GetWindowLong, толку нету,остаёться пустой буфер и всё Гм, у меня GetWindowLong выдает hInstance моего приложения, а не владельца окна... Где-то когда-то я слышал, что многие API-функции разрешают работать только со своими окнами, может, и зедсь так? вот зараза, мне просто надобно получить иконку активного окна, и вот я стал с этим выкобениваться, и бестолку Помочь могу немногим, разме что вот чем: 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 2 Sharp У меня GetWindowLong возвращает разные значения для разных hWnd. 2 zoomersd Скорее всего он не работает с OLE-строками. Попробуй в качестве буфера указать байтовый массив. to CyRax to All а в других языках программировани это кто-нибудь встречал? Объявляешь байтовый массив: Dim a(255) As Byte Передаешь адрес его первого (вернее, нулевого) элемента функции: Func a(0) Если написать Func ByVal a(0), то VB передаст значение a(0), а если просто a(0), то он передаст его адрес. Элементы байтового массива расположены в памяти один за другим, что делает их хорошими заменителями строк, однако их использование сопряжено с определенными трудностями с переводом в строки. и всё-равно непонятно, я к сожалению в байтах как свинья в апельсинах, поэтому можно пожалуйста почётче и желательно с примером К сожалению готового примера у меня нет. А делать влом. Попробуй объявить массив байт разрешением скажем в 250 и передай вместо строки в вызываемую функцию первый байт массива: ДИМ Массив(250) Аз Байт Функция Параметр1,Массив(0), Параметр2,... ПараметрН. тоесть у меня код в итоге должен выглядеть вот так: Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long Private Sub Timer1_Timer()
Вопрос: имя файла
Добавлено: 14.02.04 00:18
Автор вопроса:
ZoomerSD | ICQ: 148640473
вопрос: как мне получить полное имя файла и путь до него, зная hWnd его окна?
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 14.02.04 02:30
Номер ответа: 2
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #2
Добавлено: 14.02.04 16:09
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
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-сайт:
Профиль | | #3
Добавлено: 15.02.04 03:18
Номер ответа: 4
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #4
Добавлено: 15.02.04 10:24
Номер ответа: 5
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 16.02.04 03:51
GetWindowWord
Номер ответа: 6
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #6
Добавлено: 16.02.04 17:08
(
Номер ответа: 7
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 16.02.04 21:31
Номер ответа: 8
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #8
Добавлено: 16.02.04 21:40
Номер ответа: 9
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 17.02.04 00:05
Номер ответа: 10
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 17.02.04 01:25
Номер ответа: 11
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #11
Добавлено: 17.02.04 19:47
, поподробнее пожалуйста про байтовый массив, как его использовать?
Номер ответа: 12
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 17.02.04 19:51
Номер ответа: 13
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #13
Добавлено: 17.02.04 20:50
Номер ответа: 14
Автор ответа: CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 18.02.04 00:41
Номер ответа: 15
Автор ответа: ZoomerSD
ICQ: 148640473
Вопросов: 135
Ответов: 270
Профиль | | #15
Добавлено: 18.02.04 22:14
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
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