Зная ID процесса нужно сделать hide\unhide form

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Зная ID процесса нужно сделать hide\unhide form

Сообщение MEMBER » 09.04.2004 (Пт) 17:00

Можно зная ID процесса выцепить hWnd формы?
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 09.04.2004 (Пт) 18:01

EnumThreadWindows

The EnumThreadWindows function enumerates all nonchild windows associated with a thread by passing the handle of each window, in turn, to an application-defined callback function. EnumThreadWindows continues until the last window is enumerated or the callback function returns FALSE.

Declare Function EnumThreadWindows Lib "user32" Alias "EnumThreadWindows" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long

· dwThreadId
Identifies the thread whose windows are to be enumerated.

· lpfn
Points to an application-defined callback function. For more information about the callback function, see the EnumThreadWndProc callback function.

· lParam
Specifies a 32-bit, application-defined value to be passed to the callback function.

Код: Выделить всё
'in a form
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim ThreadID As Long, ProcessID As Long  ' receive id to thread and process of Form1
    ' Determine the thread which owns this window
    ThreadID = GetWindowThreadProcessId(Me.hWnd, ProcessID)
    ' Use the callback function to list all of the enumerated thrad windows
    EnumThreadWindows ThreadID, AddressOf EnumThreadWndProc, 0
    'Show the results
    Me.AutoRedraw = True
    Me.Print sClasses
End Sub
'In a module
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Declare Function EnumThreadWindows Lib "user32" (ByVal dwThreadId As Long, ByVal lpfn As Long, ByVal lParam As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
'variable used to list all the classnames
Public sClasses As String
Public Function EnumThreadWndProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
    Dim Ret As Long, sText As String
    'create a string-buffer
    sText = Space(255)
    'get the classname of the window handle
    Ret = GetClassName(hWnd, sText, 255)
    'cut off the unnecessary part of Chr$(0)'s
    sText = Left$(sText, Ret)
    'add this classname to the list of classnames
    sClasses = sClasses + sText + vbCrLf
    'continue the enumeration
    EnumThreadWndProc = 1
End Function


Кажется, самое оно :)
Прямо из API-Guide :)

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.04.2004 (Пт) 18:03

Попробую. Спасибо.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.04.2004 (Пт) 18:22

Похоже не то, там в качестве параметра передаётся hWnd родительского окна (формы), а мне его как раз узнать и надо.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 09.04.2004 (Пт) 18:46

Да, жаль... Будем искать...

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.04.2004 (Пт) 19:37

Сделал, если интересно кому, могу выложить проект.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 09.04.2004 (Пт) 20:06

Хотелось бы посмотреть :)

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 09.04.2004 (Пт) 20:32

Смотри. :)
Вложения
Pid_To_hWnd.rar
По PID полученному при запуске программы с помощью функции Shell находит hWnd окна запущенного приложения
(1.78 Кб) Скачиваний: 76
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 10.04.2004 (Сб) 6:23

Спасибо за код!
Странно, но я тоже предполагал перебирать hwnd в поиске нужного :)

Хотя код немного "неэлегантный"... Некрасиво как-то немного всё перебирать... Может, всё-таки, есть другой, "более правильный" код?

P.S. Я никоим образом не хочу никого обидеть :)
Код хороший, работает быстро, ничего сказать нельзя. Кстати, у меня проводит 26 итераций в поиске pid'а... Просто хоцца чего-то, работающего без "тупого перебора" :)
P.P.S. надеюсь, все меня правильно поняли? :mrgreen:

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 10.04.2004 (Сб) 8:28

У меня как-то была немного похожая задача, надо было получить hWnd окна (сначала родительского, потом дочернего, зная лишь заголовок рродительского) (вообще-то надо было даже получить дескриптор дочернего окна)

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

если не знаешь точно lpClassName и lpWindowName, то могу скинуть прогу, которая их светит. (мышой на форму наводишь- прога инфу показует)
вот как я юзал:
Код: Выделить всё
Dim WinDC As Long, WinDesc As Long
Dim WinDescChild(1 To 3) As Long
WinDesc = FindWindow("AfxFrameOrView42s", "View Finder - Philips ToUcam Camera")
If WinDesc = 0 Then End
WinDescChild(1) = FindWindowEx(WinDesc, 0, "#32770", "")
WinDescChild(2) = FindWindowEx(WinDescChild(1), 0, "Static", "")
WinDescChild(3) = FindWindowEx(WinDescChild(2), 0, "VideoRenderer", "ActiveMovie Window")
WinDC = GetDC(WinDescChild(3))


как понимаешь, вместо "AfxFrameOrView42s", "View Finder - Philips ToUcam Camera" лепишь своё...

кстати, присоед прогу, что показует класс и заголовок (и ещё кое что)
если будет выпадать и глючить, пришлю исходник...
Вложения
Query.rar
(2.94 Кб) Скачиваний: 52
Noname - это самый популярный брэнд.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 10.04.2004 (Сб) 16:28

Doctor Nestor
Она совсем непохожая. В твоём случае поиск строился на Caption (его надо было знать изначально), поэтому этот вариант не универсален.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 140

    TopList