Ребята, хелп плиз!
Нужно узнать hWnd запускаемого моей приложения (окна). Желательно через API функции. Если бы оформить это в виде обычной функции, которая и возвращала бы этот номер?
Примером:
Private Function GethWndApp(ByVal PathToFile As String)As Long
Может через процесс как то узнать можно?
А что известно из параметров окна?
заголовок есть? тогда FindWindow
Оно активное в данный момент? тогда GetForegroundWindow.
Курсор над этим окном? тогда WindowFromPoint.
Ребята, а нельзя каким-нибудь образом преобразовать хэндл процесса в хендл главного окна этого процесса?
И еще, вот что нарыл, это то, что мне нужно, но я проверял и почему-то 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.
'
 im ProcessID As Long
 im PID As Long
 im hProcess As Long
 im 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)
 o 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
можно перебрать все формы в системе... свериться с пом. GetWindowThreadProcessId с PID'ом процесса... тогда ты сможешь получить ВСЕ хэндлэ окошек процесса... а вот что там главное - не знает никто )
Примером:
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. Взять где-то с это сайта
Т.е. получаешь все существующие хендалы, потом в массив получаешь имя проги на каждый хендел, потом циклом подбираешь имя проги что передал функции, и те что есть в массиве, и в другой массив кидаешь хендел того что совпадёт.