Страницы: 1
RSS
Переключение вкладок в программе vba api, Поиск сособа управления вкладками api vba
 
Добрый день! Подскажите как можно переключаться между вкладками в программе посредством Api. Класс элементов TTabSheet. Хендлер я нахожу и пробую через sendmessage и postmessage, с параметром TCM_setcurfocus, ничего не получается.
Также, если есть возможность, сбросьте ссылку, либо название, на литературу vba api.  
Изменено: Jerry.Sweer - 28.12.2022 21:03:23 (Ошибки)
 
Цитата
пробую через sendmassage и postmassage
А причём тут массаж (massage)? Обычно не массажем, а сообщением (message) пользуются..
 
не нужно заряжать пушку для стрельбы по воробьям
переключайтесь с помощью
Worksheets(N).Activate
где N порядковый номер листа в книге
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Возможно я некорректно написал. Под программой я имел ввиду учетную базу oracle. Там присудствуют вкладки, между которыми мне нужно переключаться.  
 
Игорь, просто очень люблю массаж))  
 
Цитата
Jerry.Sweer написал:
Под программой я имел ввиду учетную базу oracle
Oracle, говорите, так вот она что!
об этом, видимо догадались все и сразу кроме меня(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, ирония-это замечательно!  
 
Jerry.Sweer, в Microsoft Spy++ можно отследить сообщения для конкретного окна
 
testuser, к сожалению политика компании не позволяет использовать сторонние приложения. Вытягиваю hwnd средствами vba.
Как можно ещё проверить эту информацию?  
 
Jerry.Sweer, проверьте на другом ПК, вне компании, на котором есть Oracle. К любому окну идет поток сообщений, их нужно фильтровать, знать что они значат..
Изменено: testuser - 29.12.2022 10:22:00
 
testuser, удаленка, будь она неладна. К сожалению тут без вариантов. Может есть какие - то варианты либо предположения? Может литературу посоветуете, в которой можно покопаться.
В принципе процедуру автоматизации я выполнил через sendkeys, но хотелось - бы скил наращивать.
 
Цитата
Jerry.Sweer написал:
Вытягиваю hwnd средствами vba
так можно никогда не достучаться до нужных окон, потому что нет понимания какое окно какому принадлежит и какой у него тип.
Цитата
Jerry.Sweer написал:
Может литературу посоветуете
какую? Перечень всех окон Oracle в чужом ПК? :) Нет в природе литературы, которая даст представление о структуре окон отдельного приложения.
Это все, конечно, больше шутки. Да, можно и через VBA попробовать вытянуть структуру окон - но для этого надо будет неплохо погрузиться в тему API и нормальную кучу кода написать, чтобы самому выводить все окна с их зависимостями. Здесь можно посоветовать даже не литературу, а поиск в сети по запросу вроде "список всех окон windows vba api".
Изменено: Дмитрий(The_Prist) Щербаков - 29.12.2022 10:30:05
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Пользуюсь данным кодом

Код
Option Explicit 
 
Private 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 
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _ 
(ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ 
(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
 
Private x As Integer 
 
 'Used a user defined type here rather than Enum so that it works on 97
Private Type winEnum 
    winHandle As Integer 
    winClass As Integer 
    winTitle As Integer 
    winHandleClass As Integer 
    winHandleTitle As Integer 
    winHandleClassTitle As Integer 
End Type 
Dim winOutputType As winEnum 
 
Public Sub GetWindows() 
    x = 0 
    winOutputType.winHandle=0 
    winOutputType.winClass=1 
    winOutputType.winTitle=2 
    winOutputType.winHandleClass=3 
    winOutputType.winHandleTitle=4 
    winOutputType.winHandleClassTitle=5 
     
    GetWinInfo 0&, 0, winOutputType.winHandleClassTitle 
End Sub 
 
 
Private Sub GetWinInfo(hParent As Long, intOffset As Integer, OutputType As Integer) 
     'Sub to recursively obtain window handles, classes and text
     'given a parent window to search
     'Written by Mark Rowlinson
     'www.markrowlinson.co.uk - The Programming Emporium
    Dim hWnd As Long, lngRet As Long, y As Integer 
    Dim strText As String 
    hWnd = FindWindowEx(hParent, 0&, vbNullString, vbNullString) 
    While hWnd <> 0 
        Select Case OutputType 
        Case winOutputType.winClass 
            strText = String$(100, Chr$(0)) 
            lngRet = GetClassName(hWnd, strText, 100) 
            Range("a1").Offset(x, intOffset) = Left$(strText, lngRet) 
        Case winOutputType.winHandle 
            Range("a1").Offset(x, intOffset) = hWnd 
        Case winOutputType.winTitle 
            strText = String$(100, Chr$(0)) 
            lngRet = GetWindowText(hWnd, strText, 100) 
            If lngRet > 0 Then 
                Range("a1").Offset(x, intOffset) = Left$(strText, lngRet) 
            Else 
                Range("a1").Offset(x, intOffset) ="N/A" 
            End If 
        Case winOutputType.winHandleClass 
            Range("a1").Offset(x, intOffset) = hWnd 
            strText = String$(100, Chr$(0)) 
            lngRet = GetClassName(hWnd, strText, 100) 
            Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet) 
        Case winOutputType.winHandleTitle 
            Range("a1").Offset(x, intOffset) = hWnd 
            strText = String$(100, Chr$(0)) 
            lngRet = GetWindowText(hWnd, strText, 100) 
            If lngRet > 0 Then 
                Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet) 
            Else 
                Range("a1").Offset(x, intOffset + 1) ="N/A" 
            End If 
        Case winOutputType.winHandleClassTitle 
            Range("a1").Offset(x, intOffset) = hWnd 
            strText = String$(100, Chr$(0)) 
            lngRet = GetClassName(hWnd, strText, 100) 
            Range("a1").Offset(x, intOffset + 1) = Left$(strText, lngRet) 
            strText = String$(100, Chr$(0)) 
            lngRet = GetWindowText(hWnd, strText, 100) 
            If lngRet > 0 Then 
                Range("a1").Offset(x, intOffset + 2) = Left$(strText, lngRet) 
            Else 
                Range("a1").Offset(x, intOffset + 2) ="N/A" 
            End If 
        End Select 
         'check for children
        y = x 
        Select Case OutputType 
        Case Is > 4 
            GetWinInfo hWnd, intOffset + 3, OutputType 
        Case Is > 2 
            GetWinInfo hWnd, intOffset + 2, OutputType 
        Case Else 
            GetWinInfo hWnd, intOffset + 1, OutputType 
        End Select 
         'increment by 1 row if no children found
        If y = x Then 
            x = x + 1 
        End If 
         'now get next window
        hWnd = FindWindowEx(hParent, hWnd, vbNullString, vbNullString) 
    Wend 
     
End Sub
 
Дмитрий(The_Prist) Щербаков, Перечень указателей окон с названием классов и окон вывожу кодом. Класс окна, требуемого элемента, TTabSheet
Страницы: 1
Читают тему
Наверх