Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Как узнать hWnd приложения? Добавлено: 02.07.05 22:07  

Автор вопроса:  KOKA
Ребята, хелп плиз!
Нужно узнать hWnd запускаемого моей приложения (окна). Желательно через API функции. Если бы оформить это в виде обычной функции, которая и возвращала бы этот номер?
Примером:
Private Function GethWndApp(ByVal PathToFile As String)As Long
Может через процесс как то узнать можно?

Ответить

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

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #1
Добавлено: 02.07.05 22:13
А что известно из параметров окна?
заголовок есть? тогда FindWindow
Оно активное в данный момент? тогда GetForegroundWindow.
Курсор над этим окном? тогда WindowFromPoint.

Ответить

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



Вопросов: 14
Ответов: 27
 Профиль | | #2 Добавлено: 02.07.05 23:03
Пасиб за ответ...
Тут известно только путь к файлу запуска.
Может как-то можно с помощью OpenProcess?
А там может по другому, а?

Ответить

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


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 03.07.05 01:13
Есть пример на сайте получение имени программы с хендела, обратное - аналогично, ищи...

Ответить

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



Вопросов: 14
Ответов: 27
 Профиль | | #4 Добавлено: 03.07.05 01:58
Ребята, а нельзя каким-нибудь образом преобразовать хэндл процесса в хендл главного окна этого процесса?
И еще, вот что нарыл, это то, что мне нужно, но я проверял и почему-то hWnd который возвращаеться этой функцией - неправильный! Почему?

Public Function hWndShell(ByVal JobToDo As String, Optional ExecMode As VbAppWinStyle) As Long
   '
   ' Shells a new process and returns the hWnd
   ' of its main window.
   '
   ;Dim ProcessID As Long
   ;Dim PID As Long
   ;Dim hProcess As Long
   ;Dim hWndJob As Long

   If IsMissing(ExecMode) Then
      ExecMode = vbMinimizedNoFocus
   Else
      If ExecMode < vbHide Or ExecMode > vbMinimizedNoFocus Then
         ExecMode = vbMinimizedNoFocus
      End If
   End If

   On Error Resume Next
      ProcessID = Shell(JobToDo, CLng(ExecMode))
      If Err Then
         hWndShell = 0
         Exit Function
      End If
   On Error GoTo 0

   hWndJob = FindWindow(vbNullString, vbNullString)
   ;Do While hWndJob <> 0
      If GetParent(hWndJob) = 0 Then
         Call GetWindowThreadProcessId(hWndJob, PID)
         If PID = ProcessID Then
            hWndShell = hWndJob
            Exit Do
         End If
      End If
      hWndJob = GetWindow(hWndJob, GW_HWNDNEXT)
   Loop
End Function

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 03.07.05 03:03
можно перебрать все формы в системе... свериться с пом. GetWindowThreadProcessId с PID'ом процесса... тогда ты сможешь получить ВСЕ хэндлэ окошек процесса... а вот что там главное - не знает никто )

Ответить

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


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 03.07.05 03:18
Примером:
Private Function GethWndApp(ByVal PathToFile As String)As Long


небольшая погрешность... У одной программы может быть открыто несколько окнок, и каждое имеет свой hWnd, так какое тебе окно :)? Ну есть вариант возвратить массив всех хендалов... Вообщем вот пример который возвращает имя проги ко хендалу:


Const TH32CS_SNAPPROCESS As Long = 2&
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwflags As Long
szexeFile As String * MAX_PATH
End Type
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlgas As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "Kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "Kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)




Public Function GetExeFromHandle(hWnd As Long) As String
'Получение полного пути exe-файла из его хэндла
Dim threadID As Long, processID As Long, hSnapshot As Long
Dim uProcess As PROCESSENTRY32, rProcessFound As Long
Dim i As Integer, szExename As String
threadID = GetWindowThreadProcessId(hWnd, processID)
If threadID = 0 Or processID = 0 Then Exit Function
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&;)
If hSnapshot = -1 Then Exit Function
uProcess.dwSize = Len(uProcess)
rProcessFound = ProcessFirst(hSnapshot, uProcess)
Do While rProcessFound
If uProcess.th32ProcessID = processID Then
i = InStr(1, uProcess.szexeFile, Chr(0))
If i > 0 Then szExename = uProcess.szexeFile
Exit Do
Else
rProcessFound = ProcessNext(hSnapshot, uProcess)
End If
Loop
Call CloseHandle(hSnapshot)
GetExeFromHandle = szExename
End Function


P.S. Взять где-то с это сайта :)

Т.е. получаешь все существующие хендалы, потом в массив получаешь имя проги на каждый хендел, потом циклом подбираешь имя проги что передал функции, и те что есть в массиве, и в другой массив кидаешь хендел того что совпадёт.

Ответить

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



Вопросов: 14
Ответов: 27
 Профиль | | #7 Добавлено: 06.07.05 01:23
Знаю, что Главное окошко по Чайлдам можно найти с помощью GetWindowLong. Врое получалось...

Ответить

Страница: 1 |

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



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