VB6, EnumWindows, PID и консоль

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

VB6, EnumWindows, PID и консоль

Сообщение Tamplier » 18.09.2006 (Пн) 8:30

Не получаетсчя определить хендл консоли. Везде посмотрел, все сделал, пробовал даже откомпилированное приложение запускать, все равно никаким боком не накодит.
Код: Выделить всё
'CallBack EnumWindows
Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
   
    Dim lngCurProcId As Long, lngWinThrProcId As Long, lngPId
   
    lngCurProcId = GetCurrentProcessId
    lngWinThrProcId = GetWindowThreadProcessId(hWnd, lngPId)
    ConsoleWrite CStr(lngCurProcId) & " - " & CStr(lngWinThrProcId) & vbCrLf
   
    If lngCurProcId = lngWinThrProcId Then
        hCon = hWnd
        EnumWindowsProc = False
    Else
        EnumWindowsProc = True
    End If
   
End Function

Выходит список процессов, причем ни один не совпадает с текущим. Что странно, даже во время отладки не находит окно самого VB...

Может кто подсказать, в чем дело?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.09.2006 (Пн) 9:57

У тебя lngPId объявлена как Variant, не отсюда ли ноги растут? И как объявлена GetWindowThreadProcessId?
Весь мир матрица, а мы в нем потоки байтов!

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 18.09.2006 (Пн) 15:58

!Viper! писал(а):У тебя lngPId объявлена как Variant

Спасибо, но ничего не изменилось.

Код: Выделить всё
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.09.2006 (Пн) 16:04

Не там. В функции.
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 18.09.2006 (Пн) 16:26

alibek писал(а):Не там. В функции.

:shock: Не понял. Как это "в функции"? В какой функции. CallBack приведен полностью. Объявлена функция в модуле. И вообще, программа состоит из одного модуля.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.09.2006 (Пн) 16:30

Dim lngCurProcId As Long, lngWinThrProcId As Long, lngPId As Long
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 18.09.2006 (Пн) 16:52

alibek писал(а):Dim lngCurProcId As Long, lngWinThrProcId As Long, lngPId As Long

Tamplier писал(а):Спасибо, но ничего не изменилось.

Это я вынул из какого-то примера и так понял, что GetWindowThreadProcessId возвращает идентификатор процесса, а как оказалось, он его присваивает, в данном случае, lngPId. Но тогда вопрос, а что тогда такое возвращает функция?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.09.2006 (Пн) 16:57

а MSDN открыть не дано?
Return Values
The return value is the identifier of the thread that created the window.
Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 19.09.2006 (Вт) 16:16

Да? А почему он тогда не находит прочесс, открывший консоль? И почему значения lngPId отличается от того, что возвращает функция?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.09.2006 (Вт) 18:43

Tamplier писал(а):И почему значения lngPId отличается от того, что возвращает функция?

Читать умеешь?
Изображение

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 21.09.2006 (Чт) 19:12

И какая разница? Разве не один и тот же процесс создает окно и родитель ему, если ничего насильно не менять?

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 21.09.2006 (Чт) 19:23

Tamplier
Ты вправду не читаешь до конца что тебе пишут? tyomitch тебе намекает, что функция возвращает ThreadID который естественно не равен ProcessID.
Если всё делать своими ручками, они скоро отвалятся !

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 22.09.2006 (Пт) 7:11

Kavu писал(а):Ты вправду не читаешь до конца что тебе пишут? tyomitch тебе намекает, что функция возвращает ThreadID который естественно не равен ProcessID.

Упс... Прошу прощения. Я не заметил, что там ThreadID, а не ProcessID... Глаза кривые, слепые и прочие радости жизни. Еще раз прошу прощения.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 22.09.2006 (Пт) 8:34

Tamplier
Вот немного изменённый код, проверял естественно вне консоли.
Код: Выделить всё

Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
   
    Dim lngCurProcId As Long, lngWinThrProcId As Long
   
    lngCurProcId = GetCurrentProcessId
      GetWindowThreadProcessId hwnd, lngWinThrProcId
    ConsoleWrite CStr(lngCurProcId) & " - " & CStr(lngWinThrProcId) & vbCrLf
   
    If lngCurProcId = lngWinThrProcId Then
        hCon = hwnd
        Debug.Print "success"
        EnumWindowsProc = False
    Else
        EnumWindowsProc = True
    End If
   
End Function
Если всё делать своими ручками, они скоро отвалятся !

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 22.09.2006 (Пт) 16:01

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 122

    TopList