Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 18.10.2016
Сообщений: 23
1

Как получить hWnd окна стороннего приложения, которое свёрнуто в трей

17.11.2018, 00:12. Показов 3863. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть такая функция, как IsWindowVisible, которая может вычислять, свернуто окно приложения в трей или нет, но ей требуется для этого hWnd, после сворачивание в трей получить hWnd не получается, помогите пожалуйста решить проблему.

Вот недоработанный код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<DllImport("user32.dll")>
    Public Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As Boolean
    End Function
 
Private Const SW_HIDE As Int32 = 0
Public Const SW_SHOW As Int32 = 5
 
Public Sub IsVisible()
        For Each p As Process In Process.GetProcessesByName("taskmgr")
            If IsWindowVisible(p.MainWindowHandle) Then
                ShowWindow(p.MainWindowHandle, SW_HIDE) 'Свернуть окно в трей, если оно видимое
            Else
                ShowWindow(p.MainWindowHandle, SW_SHOW) 'Развернуть окно из трея
            End If
        Next
    End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2018, 00:12
Ответы с готовыми решениями:

Как получить HWND окна моего приложения?
создал Win32ConsoleApplication и нжно из программы получить егодискриптор только без FindWindow......

Получить координаты окна стороннего приложения
Здравствуйте дорогие форумчане, встал вопрос как получить координаты СТОРОННЕЙ программы , при...

Как определить hwnd внешнего/стороннего окна или текстового поля по клику мышой
как определить hwnd текстового поля стороннего приложения, кликнув по нему мышкой? Необходимо мне...

Получить дескриптор окна стороннего приложения и контекстного меню
Здравствуйте. Подскажите пожалуйста. Как можно словить дескриптор выскакивающего окна? в списке...

4
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
17.11.2018, 05:39 2
Функция FindWindow. User32.dll. Все определяется.
0
0 / 0 / 0
Регистрация: 18.10.2016
Сообщений: 23
17.11.2018, 13:23  [ТС] 3
Возможно я чтото упускаю, но в функции FindWindow требуется указать класс или заглавие указанного вами окна, что бы узнать класс, надо знать hWnd окна, и тоже самое с заглавием, привожу пример, который будет работать только с развёрнутым окном:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowByClass( _
     ByVal lpClassName As String, _
     ByVal zero As IntPtr) As IntPtr
    End Function
 
    <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowByCaption( _
     ByVal zero As IntPtr, _
     ByVal lpWindowName As String) As IntPtr
    End Function
 
    <DllImport("user32.dll", EntryPoint:="GetClassNameW")> _
    Public Shared Function GetClassNameW(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
    End Function
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Integer, ByVal lpWindowName As Integer) As Integer
 
Private Declare Auto Function FindWindowEx Lib "user32" (ByVal parentHandle As Integer, _
                                               ByVal childAfter As Integer, _
                                               ByVal lclassName As String, _
                                               ByVal windowTitle As String) As Integer
 
For Each p As Process In Process.GetProcessesByName("taskmgr")
            Dim classname As New System.Text.StringBuilder(256)
            GetClassNameW(p.MainWindowHandle, classname, 256)
            Dim Caption As New System.Text.StringBuilder(256)
            GetWindowText(p.MainWindowHandle, Caption, Caption.Capacity)
            MsgBox(FindWindow(classname.ToString, Caption.ToString)) 'Получение hWnd окна, зная класс или заголовок окна
            MsgBox(FindWindowEx(Nothing, Nothing, classname.ToString, Caption.ToString)) 'Получение hWnd окна, зная класс или заголовок окна
            Dim GetWindow As Integer = FindWindowByClass(classname.ToString, IntPtr.Zero)
            MsgBox(GetWindow) 'Получение hWnd окна, зная класс окна
            Dim GetHandle As String = FindWindowByCaption(IntPtr.Zero, Caption.ToString)
            MsgBox(GetHandle) 'Получение hWnd окна, зная заголовок окна
        Next
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
18.11.2018, 08:16 4
Если о окне ничего не известно, то перечислять окна топ уровня - EnumWindows, перечислять дочерние окна - EnumChildWindows
, перечислять окна потока EnumThreadWindows, запрашивать заголовок окна - GetWindowText, запрашивать id потока и процесса по хэндлу окна GetWindowThreadProcessId. Перечислять процессы и потоки с помощью Snapshot. Как p.MainWindowHandle определяет, что именно данное окно является Main сказать затрудняюсь. Можно предположить, что это первое окно топ уровня, которое появляется при перечислении для отдельно заданного процесса.
1
0 / 0 / 0
Регистрация: 18.10.2016
Сообщений: 23
18.11.2018, 16:49  [ТС] 5
Я был близок на рано сдался, действительно, с помощью EnumWindows это можно с лёгкостью узнать hWnd скрытого окна в трей, спасибо большое.
0
18.11.2018, 16:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2018, 16:49
Помогаю со студенческими работами здесь

Получить содержимое и/или элементы окна стороннего приложения
Подскажите, возможно ли с помощью C# (в том числе winapi) получить сабж?

Сворачивание стороннего приложения в трей
Как свернуть другую-чужую программу (.exe) в трей. Обрыл весь форум , есть сворачивание в трей...

Как получить HWND окна/процесса/консоли
Как получить HWND окна/процесса/консоли? мне надо для Shellexecute. Реализация в Dll #include...

Как установить координаты окна стороннего приложения
как сделать чтобы моя программа перенесла окно(например текстового докум) на определенные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru