powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работаем с окнами Win32
24 сообщений из 24, страница 1 из 1
Работаем с окнами Win32
    #34488002
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер.

Меня очень интересует вопрос работы с окнами Win32а точней:
Нажатие кнопки на окне
Перехват текста с окне
Проставление галочек
И возможно ли скрыть это окно и все эти действия выполнять в скрытом режиме

Я так понял, что это можно выполнять через функцию PostMessage но кроме закрытия окна по ней ни чего не нашел.

Помогите пожалуйста очень нужно.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34488722
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел на это и несколько удивился. Что вы пишите?
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34488824
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Н..да. Наводит на размышления. Melkiades плюс тебе за внимательность.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34489417
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkiadesПосмотрел на это и несколько удивился. Что вы пишите?
И чего здесь удивительного?


AndreyMpН..да. Наводит на размышления. Melkiades плюс тебе за внимательность. На какие же размышления наводит ну ко поделитесь?
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34489546
AndreyMp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем тебе мои домыслы. Не привык я выкладывать непроверенную инфу. Каждый думает по своему. Лучше ответь Melkiades , и все всем станет ясно.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34489734
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyMpН..да. Наводит на размышления. Melkiades плюс тебе за внимательность.
гыгы....
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34489972
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyMpЗачем тебе мои домыслы. Не привык я выкладывать непроверенную инфу. Каждый думает по своему. Лучше ответь Melkiades , и все всем станет ясно.

Если вам так интересно, в данный момент я пишу утилиту для автоматического заполнения базы данных через интерфейс окна оригинальной программы(базы) используя данные Excel. А почему не на прямую в файлы базы, да потому-то структура базы непонятная или зашифрованная.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34490036
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно использоваеть Automate, классная прога
все готово, есть куча фишек, есть даже язык встроенный и т.д.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34490198
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу нажатия кнопки.

С помощью функции FindWindow ищем хендл окна. С помощью функции SendMessage отправляем команду на нажатие кнопки. Если хочешь нажимать кнопки меню, то тебе еще понадобятся функции GetMenu, GetSubMenu, GetMenuItemID.

Пример.

Запустим калькулятор и программно нажмем кнопки "9" и извлечение квадратного корня.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Private Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long

Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long

Private Const WM_COMMAND = &H111

Public Sub PushTheButton()
    Dim hWnd As Long
    Dim lngI As Long

    Shell "calc.exe", vbNormalFocus
    
    hWnd = FindWindow(vbNullString, "Калькулятор")
    
    SendMessage hWnd, WM_COMMAND,  133 ,  0 &
    SendMessage hWnd, WM_COMMAND,  103 ,  0 &
End Sub

Извини, остальные вопросы лениво копать.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34490202
RUSYA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе копаешь правельно, продолжай...

пригодятся
Код: plaintext
1.
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Ты только пойми принцип, остальное фигня... У каждого объекта есть идентификатор аля хендел. Вся твоя задача сводится к поиску нужного хендела (объекта) и отсылкой в него сообщений (Send/PostMessage), ну и полчения ответа ессно...

авторНажатие кнопки на окне
Находиш хендел(hWnd) нужной кнопки - и вперёд...
Код: plaintext
1.
2.
Call PostMessage(hWnd, WM_LBUTTONDOWN,  0 ,  0 )
Call Sleep( 10 &)
Call PostMessage(hWnd, WM_LBUTTONUP,  0 ,  0 )

авторПерехват текста с окне
а вот тут подумай, напрмер обычный лабел в бейсике, это никакой не текст, нету текста(объекта) на форме. Считает что лабел это как бы картинка прорисованная на форме, ну только вместо изображения там текст. Поэтому с этим могут быть проблемы. Есть в принципе другой тип лабелов, котрорый действительно является объектом - ну тогда как обычно, находиш хендел лабела, посылаешь ему WM_GETTEXT

авторИ возможно ли скрыть это окно и все эти действия выполнять в скрытом режиме
Код: plaintext
Private Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34490213
RUSYA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ashton
Кнопку правельно нажимать через Post, иначе она может ненажаться, или нажаться и не отпустится.. лучше использовать потоковый буфер сообщений
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34491310
RUSYA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, извиняюсь! не то скопипестил!
Код: plaintext
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
!
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34491469
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как правильно определить Hwnd кнопки. Я делаю вот так но не на всех кнопках работает, например не работает в стандартном окне сохранения документа на кнопке сохранить.


ModDlgHWND = FindWindow(vbNullString, "Сохранение документа")
btnOkHWND = FindWindowEx(ModDlgHWND, 0, "Button", "Сохранить")
PostMessage btnOkHWND, BM_CLICK, 0, 0


И какие еще способы есть?
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34492331
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В справке по сообщению BM_CLICK.

BM_CLICK Message If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail . To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.

Код: plaintext
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.
Private Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long
  
Private Declare Function FindWindowEx& Lib "user32" _
  Alias "FindWindowExA" ( _
  ByVal hWndParent As Long, _
  ByVal hWndChildAfter As Long, _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String)
  
Private Declare Function PostMessage Lib "user32" _
  Alias "PostMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long

Private Const WM_SETFOCUS = &H7
Private Const BM_CLICK = &HF5

Public Sub X()
    Dim hWindow As Long
    Dim hButton As Long
    
    hWindow = FindWindow("#32770", "Блокнот")
    hButton = FindWindowEx(hWindow,  0 , "Button", "&Да")
    PostMessage hWindow, WM_SETFOCUS,  0 ,  0 
    PostMessage hButton, BM_CLICK,  0 ,  0 
End Sub
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34492382
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу добавить.

Если определяется хендл, но не нажимается кнопка, тогда мое сообщение выше.

Если не определяется хендл, то поробуй так записать "&Сохранить". Также, можешь попробовать оправить сообщение с использование функции GetDlgItem.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34492486
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дашло наконецто про знак "&" забыл
Код: plaintext
 hButton = FindWindowEx(hWindow,  0 , "Button", "Со&хранить")

Дошел до заполнения и чтения ячеек типа TextBox и ListBox и стопорнулся

авторнаходиш хендел лабела, посылаешь ему WM_GETTEXT
а какже здесь определить hwnd?
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34494270
RUSYA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да с лабелом врядли получится, я ж говорю, лабел это 95% случаем не объект. У него нет хендела.

Ещё один вариант для нахождение хенделов - это перебирать нафиг все )))
API EnumChildWindow ... Ну а потом например по координатам, по цвету, запаху гы )) вынюхать нужный объект ))
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34494334
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не про лабелы а про TextBox и ListBox или это аналогично?
Мне тут еще подсказали что есть такая утилитка наводишь курсор на объект окна и тебе вся инфа об объекте в том числе и хендл но где взять не знаю, может кто слышел или знает?
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34494382
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел я утилитку для определения hwnd, но не тут то было ведь это не постоянный идентификатор.
Тогда вопрос для Ashton а что это за цифры и откуда 133, 103 (всмысли откудо получил)?


Ashton hWnd = FindWindow(vbNullString, "Калькулятор")
SendMessage hWnd, WM_COMMAND, 133, 0&
SendMessage hWnd, WM_COMMAND, 103, 0&
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34494644
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос закономерный.

Я тоже сначала подумал, как же мне узнать ID кнопок приложения, которые впоследствии я могу использовать в качестве параметра функции SendMessage.

На самом деле все просто. Рекурсивно прошелся по всем дочерним окнам главного окна (в моем примере, окно "Калькулятора").

Хендл определял так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    hwnd = GetWindow(hwndMain, GW_CHILD)
    hwndTemp = hwnd

    Do While hwndTemp <>  0 
        ....
        hwnd = GetWindow(hwndTemp, GW_HWNDNEXT)
        ....
    Loop

Класс так:

Код: plaintext
    GetClassName

Текст так:

Код: plaintext
    SendMessage hwnd, WM_GETTEXT, ..., ...

ID так:

Код: plaintext
    GetDlgCtrlID

По поводу утилитки. Хорошая утилитка SPY+, входящая в состав Visual Studio.
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34496541
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все понял. Нашел тут исходник для определения hwnd добавил GetDlgCtrlID для отображения ID и получил то что надо.

Код: plaintext
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
Option Explicit
'
' Win32 API Declarations
'
Private Declare Function SetCapture Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPointXY Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
'
Private Declare Function GetDlgCtrlID Lib "user32" (ByVal hWnd As Long) As Long
' Win32 API Structures
'
Private Type POINTAPI
   x As Long
   y As Long
End Type
'
' Form-level member variables
'
Private m_hWnd As Long
Private m_Picking As Boolean

Private Sub Command1_Click()
   '
   ' Attempt to paste something into
   ' selected window.
   '
   If m_hWnd Then
      Clipboard.Clear
      Clipboard.SetText "Hello from VB5!", vbCFText
      Call SetForegroundWindow(m_hWnd)
      SendKeys "^v", True
   End If
End Sub

Private Sub Form_Load()
   '
   ' Assign dragging pointer
   '
   Picture1.Picture = Picture1.DragIcon
   Me.MouseIcon = Picture1.DragIcon
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
   '
   ' Clear picture and turn on dragging mousepointer.
   '
   Me.MousePointer = vbCustom
   Set Picture1.Picture = Nothing
   '
   ' Remember that we're currently picking a window.
   '
   m_Picking = True
   '
   ' Capture all mousemovements from this point until
   ' the user releases the mouse button.
   '
   Call SetCapture(Picture1.hWnd)
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
   Static pt As POINTAPI
   Static hWnd As Long
   '
   ' If user is picking a window, check window is
   ' under the cursor whenever it moves.  If it's
   ' a different window than previously, update the
   ' display to that effect.
   '
   If m_Picking Then
      Call GetCursorPos(pt)
      hWnd = WindowFromPointXY(pt.x, pt.y)
      If hWnd <> m_hWnd Then
         m_hWnd = hWnd
         Me.Caption = Hex(m_hWnd) & " - " & GetDlgCtrlID(m_hWnd)
      End If
   End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
   '
   ' We're done picking now
   '
   m_Picking = False
   '
   ' Restore dragging icon to picture box,
   ' and return mousepointer to normal.
   '
   Picture1.Picture = Picture1.DragIcon
   Me.MousePointer = vbDefault
   '
   ' Don't need to be notified anymore.
   '
   Call ReleaseCapture
   '
   ' The chosen window is already stored in m_hWnd!
   '
   MsgBox "You picked hWnd: " & Hex(m_hWnd) & Chr( 13 ) & "You picked ID: " & GetDlgCtrlID(m_hWnd)
End Sub
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34496717
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зная ID TextBox`а можно чере каюнибудь функцию получить Hwnd? Или только через перебор хендлов на совпадение c ID ?
Это дя того чтоб в TextBox отправить текст.

Код: plaintext
SendMessage Hwnd, WM_SETTEXT,  0 , ByVal "Text"
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34496782
Ghost_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost_XА зная ID TextBox`а можно чере каюнибудь функцию получить Hwnd? Или только через перебор хендлов на совпадение c ID ?
Это дя того чтоб в TextBox отправить текст.

Код: plaintext
SendMessage Hwnd, WM_SETTEXT,  0 , ByVal "Text"


Я хотел сказать нельзяли упростить эту констркци:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    
    ....
    ReDim lHandles( 0 ) As Long
    l = EnumChildWindows(HwndWin, AddressOf EnumChildWindowsProc,  0 )
    For j =  1  To UBound(lHandles)
    If GetDlgCtrlID(lHandles(j)) = ID Then SendMessage lHandles(j), WM_SETTEXT,  0 , ByVal "Text": Exit For
    Next
    ....

'Модуль
Option Explicit
Global lHandles() As Long
Function EnumChildWindowsProc(ByVal wHandle As Long, lParam As Long) As Long
    ReDim Preserve lHandles(UBound(lHandles) +  1 )
    lHandles(UBound(lHandles)) = wHandle
    EnumChildWindowsProc = True
End Function
...
Рейтинг: 0 / 0
Работаем с окнами Win32
    #34497818
RUSYA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем этот глобальный массив? Делай всё в EnumChildWindowsProc...
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работаем с окнами Win32
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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