powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
5 сообщений из 5, страница 1 из 1
Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
    #39997971
Chula
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Уважаемые!

Итак, вопрос такой.
Из какого-то приложения, будь то Excel, Outlool, Accesss и т.д. программный код должен сообщить компьютеру требование необходимости вывести на экран окно какого-то определенного приложения, которое уже загружено и учитывается в панели задач.
При этом кодом уже активирован это необходимое Application и ему передан фокус.
Предварительные параметры отображения окна установлены соответствующим кодом, например кодом из макроса Outlook:
Код: vbnet
1.
2.
3.
4.
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.AppActivate "Заголовок приложения"
Application.ActiveExplorer.WindowState = olMaximized


Задача теперь его лишь принудительно вывести поверх всех открытых окон.
Как это сделать в 64-х битной системе?
Для 32-х битной решение видел через API
Какие библиотеки надо задействовать, какие константы требуется учесть?
Сразу предупреждаю, что вариант использования метода SendKeys не подходит, поскольку, если в этом приложении результатом его процессов будет некий MsgBox с выбором вариантов, то это только усложнит возможные последствия.
...
Рейтинг: 0 / 0
Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
    #39998093
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код выводит окно поверх всех, на 32 или 64 винде

Код: vbnet
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.
36.
Option Explicit

Public Const SWP_NOMOVE = 2
Public Const SWP_NOSIZE = 1
Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

Declare Function SetWindowPos Lib "user32" _
                              (ByVal hWnd As Long, _
                               ByVal hWndInsertAfter As Long, _
                               ByVal x As Long, _
                               ByVal y As Long, _
                               ByVal cx As Long, _
                               ByVal cy As Long, _
                               ByVal wFlags As Long) As Long

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

Public Function SetTopMostWindow(hWnd As Long, Topmost As Boolean) As Long
    If Topmost = True Then
        SetTopMostWindow = SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
    Else
        SetTopMostWindow = SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
        SetTopMostWindow = False
    End If
End Function

Sub Main()
    Dim hWndNotepad As Long
    hWndNotepad = FindWindow(vbNullString, "Microsoft Spy++ - [Windows 1]")
    SetTopMostWindow hWndNotepad, True
End Sub
...
Рейтинг: 0 / 0
Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
    #39998175
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WinAPI SetForegroundWindow
...
Рейтинг: 0 / 0
Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
    #40000343
Chula
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eolt, Большое спасибо за предоставленный вариант кода!

Внимательно поизучал справочные материалы, в том числе и о функциях API, таких как SetWindowPos, FindWindowA, SetForegroundWindow, ShowWindow и т.д. и, в результате, получился вот такой код, который корректно решает поставленную задачу:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
'Функция определения дескриптора окна верхнего уровня (родительского окна)
Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, _
                                                                      ByVal lpWindowName As String) As Long
'Функция активации и вывода на передний план окна с заданным дескриптором
Declare PtrSafe Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long
'Функция управления состоянием показа окна
Declare PtrSafe Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
 
'Константа, указывающая, что окно следует восстановить до исходного размера и положения
Const SW_RESTORE = 9
 
Sub msubAppActivate()
    Dim hWndApp As Long
    
    'Определяем дескриптор окна с заголовком, которое надо активировать и вывести на передний план
    hWndApp = FindWindow(vbNullString, "Заголовок окна загруженного приложения")
    SetForegroundWindow hWndApp
    ShowWindow hWndApp, SW_RESTORE
End Sub
...
Рейтинг: 0 / 0
Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
    #40011244
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Chula,

Там емнип отдача списка объектов из коллекции Items сделана както своеобразно, с динамической модификацией содержимого коллекции налету. Циклы For/For each в итоге могут валиться налету. Нужно ID сообщений коллекции перекладывать ну например в строковый массив, и циклом по нему добывать из системы объект-сообщение по конкретному ID. Както так примерно, спотыкался на подобном в Оутлуке 2003, очень удивлялся тоже.
Код: vbnet
1.
Set myObj = myFolder.Items.Restrict("[Unread]=TRUE") 
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Система 64 -х. Принудительный вывод на экран необходимого загруженного приложения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]