Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Хэндл окна Добавлено: 29.05.11 13:53  

Автор вопроса:  @lex
Запущено Х калькуляторов (для примера). Моя программа запускает еще один. Как получить хэндл окна именно того калькулятора, который запущен ей?

Ответить

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

Номер ответа: 1
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #1 Добавлено: 29.05.11 14:31
Один способ придумался... Но что-то какой-то уж слишком он извращенный, ИМХО.
Запускать Калькулятор (опять же, для примера) не тупо Shell'ом, а через CreateProcess, потом брать его PID, EnumWindows'ом перебрать все окна, и выбрать по PID'у нужное.
Может кто-то подскажет что-то более "умное"? )

Ответить

Номер ответа: 2
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #2 Добавлено: 29.05.11 15:30
Даже в "придуманном" способе возникает трабла, и не могу понять почему.
  1. Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
  2. Private Type PROCESS_INFORMATION
  3.  hProcess As Long
  4.  hThread As Long
  5.  dwProcessId As Long
  6.  dwThreadId As Long
  7. End Type
  8. Private Type STARTUPINFO
  9.  cb As Long
  10.  lpReserved As String
  11.  lpDesktop As String
  12.  lpTitle As String
  13.  dwX As Long
  14.  dwY As Long
  15.  dwXSize As Long
  16.  dwYSize As Long
  17.  dwXCountChars As Long
  18.  dwYCountChars As Long
  19.  dwFillAttribute As Long
  20.  dwFlags As Long
  21.  wShowWindow As Integer
  22.  cbReserved2 As Integer
  23.  lpReserved2 As Long
  24.  hStdInput As Long
  25.  hStdOutput As Long
  26.  hStdError As Long
  27. End Type
  28.  
  29. Private Sub Command1_Click()
  30. Dim pInfo As PROCESS_INFORMATION
  31. Dim sInfo As STARTUPINFO
  32. CreateProcess "X:\xxx\xxx.exe", vbNullString, ByVal 0&, ByVal 0&, 1&, &H20&, ByVal 0&, vbNullString, sInfo, pInfo
  33. End Sub


Получаем в pInfo.dwThreadId нужный PID. Вроде все ок, можно перечислять окна и сравнивать. А хер. Если взять, и получить PID запущенной программы другим способом, например:
  1. GetWindowThreadProcessId GetForegroundWindow, PID2

То PID2 ни разу не совпадает с pInfo.dwThreadId. Почему? Что я делаю не так? -_-

Ответить

Номер ответа: 3
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #3 Добавлено: 29.05.11 15:36
А, все понял. Я мудак. Мне нужен не pInfo.dwThreadId, а pInfo.dwProcessId. Но все еще интересует более "умный" способ решения. Если он существует.)

Ответить

Номер ответа: 4
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #4 Добавлено: 29.05.11 15:44
Да хотя пофиг, меня и этот вполне устраивает. Всем спасибо, тему можно закрывать, лол.
Сам себе форум >.<

Ответить

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



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #5
Добавлено: 29.05.11 19:16
Тут есть, помоему...
http://vbnet.ru/forum/show.aspx?id=215951

Ответить

Номер ответа: 6
Автор ответа:
 Александр



Вопросов: 0
Ответов: 1
 Профиль | | #6 Добавлено: 29.05.11 20:05
Да есть

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #7
Добавлено: 29.05.11 21:36
суть примерно та же

Ответить

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



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #8 Добавлено: 29.05.11 22:36
Может ошибаюсь, но по-моему Shell чего-то возвращает.
попробуйте
Ret=Shell ""

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 29.05.11 22:41
Shell возвращает хендл процесса, не так ли?..

Ответить

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



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #10
Добавлено: 29.05.11 22:54
ну пример я уже дал.
shell возвращает Process ID
По нему ищется ближайшее окно.
  1. Public Function GetHWND(mainHWnd As Long, PID As Long) As Long
  2.     Dim lLgthChild As Long
  3.     Dim sNameChild As String
  4.     Dim lLgthOwner As Long
  5.     Dim sNameOwner As String
  6.     Dim lHwnd As Long
  7.     Dim lHwnd2 As Long
  8.     Dim lProssId As Long
  9.  
  10.     Counter = 0
  11.     Const vbTextCompare = 1
  12.     lHwnd = GetWindow(mainHWnd, GW_HWNDFIRST)
  13.     While lHwnd <> 0
  14.         If GetParent(lHwnd) = 0 Then
  15.             lLgthChild = GetWindowTextLength(lHwnd)
  16.             sNameChild = String$(lLgthChild + 1, Chr$(0))
  17.             lLgthChild = GetWindowText(lHwnd, sNameChild, lLgthChild + 1)
  18.             If lLgthChild <> 0 Then
  19.                 Call GetWindowThreadProcessId(lHwnd, lProssId)
  20.                 If lProssId = PID Then
  21.                     GetHWND = lHwnd
  22.                     Exit Function
  23.                 End If
  24.             End If
  25.         End If
  26.         lHwnd = GetWindow(lHwnd, GW_HWNDNEXT)
  27.     Wend
  28.     
  29. End Function

Ответить

Номер ответа: 11
Автор ответа:
 @lex



Вопросов: 14
Ответов: 262
 Профиль | | #11 Добавлено: 29.05.11 23:40
Хм... Спасибо. Понятия не имел, что Shell возвращает Process ID. Х_х

Ответить

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



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #12
Добавлено: 30.05.11 01:49
Код, кстати, не идеальных, может не во всех случаях окно находить...

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #13
Добавлено: 30.05.11 17:28
Блин, спасибо ребят за вопрос, буду знать как делать.

Ответить

Номер ответа: 14
Автор ответа:
 MISTER X



ICQ: 463865965 

Вопросов: 31
Ответов: 190
 Web-сайт: studioartf.ru
 Профиль | | #14
Добавлено: 04.06.11 20:27
@lex, а монолог ниче получился :D

Ответить

Страница: 1 |

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



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