Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11

Нажать на кнопку в диалоговом окне

12.05.2016, 16:31. Показов 3448. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем. Подскажите пожалуйста, мне необходимо нажать на кнопку в окне, например "Удалить файл". Пишу код на VBA и все работает, а когда тот же код запускаю на VB.Net, то не работают функции, но и ошибки не выдает. Может на VB.Net есть какие-то свои особенности?


VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    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
 
    Sub нажать_на_кнопку()
 
        Dim hwnd As Long
        hwnd = FindWindow(vbNull, "Удалить файл") 'неправильный hwnd
        hwnd = FindWindowEx(hwnd, 0, "Button", "Н&ет") 'неправильный hwnd
        PostMessage(hwnd, 245, 0&, 0&) 'не работает
        PostMessage(hwnd, 245, 0&, 0&) 'не работает
 
        PostMessage(857560, 245, 0&, 0&) 'не работает даже с правильным  hwnd
        PostMessage(857560, 245, 0&, 0&) 'не работает даже с правильным  hwnd
  End Sub
А на VBA все работает

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2016, 16:31
Ответы с готовыми решениями:

Как нажать кнопку в окне выведенном скриптом JavaScript?
Всем привет. С помощью метода InvokeMember("click"), нажимаю на кнопку, после этого выводится окно javascript. В том окне две кнопки:...

Нажать на кнопку в чужом окне
Добрый день, подскажите, есть ли возможность получить доступ к контролам чужой формы? Т.е. есть программа-обработчик, которая обрабатывает...

Как программно нажать кнопку в активном окне?
Приветствую, к примеру у меня есть активное окошко, мне нужно нажать F1 а потом ENTER ка это можно реализовать на C#?

10
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
12.05.2016, 18:07  [ТС]
Нашел из-за чего не работало. В VB.NET при объявлении функций FindWindow, PostMessage, FindWindowEx и т.д. тип данных должен быть UInteger, а не Long, то есть:
VB.NET
1
2
3
  Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As UInteger
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As UInteger, ByVal wMsg As UInteger, ByVal wParam As UInteger, lParam As UInteger) As UInteger
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As UInteger, ByVal hWnd2 As UInteger, ByVal lpsz1 As String, ByVal lpsz2 As String) As UInteger
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
12.05.2016, 20:28
Лучший ответ Сообщение было отмечено Pabloa как решение

Решение

Достаточно везде заменить Long на Integer и правильно определить
VB.NET
1
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Integer
Добавлено через 55 минут
Наверное, более правильно
VB.NET
1
hwnd = FindWindow(vbNullString, "Удалить файл")
Также следует иметь ввиду PostMessageW (Unicode) и PostMessageA (ANSI)
1
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
13.05.2016, 14:14
Лучший ответ Сообщение было отмечено Pabloa как решение

Решение

Дополню.
ТС предложено описание функции PostMessage (взятое из VB)
VB.NET
1
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
У Д.Эпплман ("Win32 API и Visual Basic") практически аналогичное
VB.NET
1
Declare Function PostMessage& Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
При этом нужно учитывать, что в VB модификатор по умолчанию ByRef, а в VB.Net – ByVal. Также эквивалент Long в VB.Net это Integer (Int32). В данном конкретном случае As Any можно безболезненно заменить на Integer. Т.е. с формальной точки зрения в VB.Net описание может выглядеть так
VB.NET
1
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Integer
При практическом рассмотрении оказалось, что ByRef здесь вполне можно заменить ByVal (что как мне кажется, более правильно).
Пример: имеется форма "201605test", на ней кнопка "swap". По нажатию кнопки результат выводится в окно Immediate.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const BM_CLICK = 245
Private Sub tst()
    Debug.WriteLine("--Start--------------------")
    Dim hwnd As Integer = FindWindow(vbNullString, "201605test")
    Debug.WriteLine("hwnd=" & hwnd)
    Dim hwnd2 As Integer = FindWindowEx(hwnd, 0, vbNullString, "swap")
    Debug.WriteLine("hwnd2=" & hwnd2)
    Dim pp As Integer = PostMessage(hwnd2, BM_CLICK, 1, 0)
    Debug.WriteLine("pp=" & pp)
    Debug.WriteLine("--End--------------------")
End Sub
На рисунке протокол работы. Последние две строки выдача процедуры по кнопке " swap ".
Изображения
 
3
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
21.05.2022, 12:23
У меня при отправке сообщения возникает ошибка 5:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const BM_CLICK = 245
Private Sub tst()
            ' код получения хєндла окна
            Dim hwnd2 As Integer = FindWindowEx(hWnd, 0, vbNullString, "Установить")
            Debug.Print("hwnd2=" & hwnd2)
            Debug.Print("Err1==" & GetLastError.ToString)
            Dim pp As Integer = PostMessage(hwnd2, BM_CLICK, 1, 0)
            Debug.Print("Err2==" & GetLastError.ToString)
            Debug.Print("pp=" & pp)
End Sub
Сообщения в отладчике:
hwnd2=330612
Err1==0
Err2==5
pp=0
С чем может быть связана ошибка и как ее исправлять?
P.S. Само собой, нажатия кнопки на форме не происходит
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
21.05.2022, 13:02
filat18, если это весь код, то он не должен даже запуститься. Откуда вы берёте переменную hWnd в 6 строке?
0
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
21.05.2022, 13:35
MrCrown, весь код большой, не стал страницу загрязнять, ограничился строкой:
' код получения хєндла окна
та часть в порядке и хэндл окна правильный - проверял.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
21.05.2022, 16:47
filat18, Возможно кнопка у Вас имеет символ & вначале текста, тоесть фактически ее текст - &Установить.

Посмотрите, подчеркнута ли буква У и выглядить как Установить, если да, то выше сказанное должно сработать.

Добавлено через 26 минут
filat18, Опять же, нужно точно определить иерархию контролов на форме, так как кнопка может находиться на панели или в TabControl'e, и тогда Вы должны, перебрав все эти классы, добраться до кнопки и получить ее Хендл.
0
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
21.05.2022, 16:56
Цитата Сообщение от Yury Komar Посмотреть сообщение
Посмотрите, подчеркнута ли буква У и выглядить как Установить, если да, то выше сказанное должно сработать.
Я пробовал получение хэндла, через перебор дочерних компонентов формы, по классу Button. Результат тот же - ошибка 5 в строке отправки сообщения.
На всякий случай, уточню: среда - windows 10.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
21.05.2022, 19:44
filat18, покажите свой код отправки полностью.

Добавлено через 1 минуту
filat18, Вы не ответили на вопрос про первую букву в тексте кнопки.
Покажите свой код и желательно скриншот окна с кнопкой тоже

Добавлено через 16 минут
filat18, а вообще, не посылайте BM_CLICK. Послайте раздельно константы из двух сообщений: MouseDown и MouseUp.
Ошибка 5 говорит о неправильно или отсутствующем арументе. Тоесть, либо Хендл либо сообщение BM_CLICK дает ошибку.
0
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
22.05.2022, 10:36
Решил проблему!
Все дело оказалось, как и в случае с mouse_event - для Win 10 нужно запускать код от имени Администратора, тогда - сообщение проходит! и не возникает ошибки!

Цитата Сообщение от Yury Komar Посмотреть сообщение
filat18, Вы не ответили на вопрос про первую букву в тексте кнопки.
Покажите свой код и желательно скриншот окна с кнопкой тоже
Текст чистый, проверял.

P.S. ...чем дальше в леЗ, тем больше ненавижу десятку...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.05.2022, 10:36
Помогаю со студенческими работами здесь

Программно нажать кнопку в окне другой программы
Мне нужно чтоб программа могла запустить другую программу расположенную по введенному адресу и нажимать определенные кнопки в ней. Может...

Браузеры не отображают в диалоговом окне кнопку Сохранить?!
В браузерах Mozilla Firefox и IE При попытке сохранить изображение ... в диалоговом окне кнопки "СОХРАНИТЬ" НЕТ... баузеры...

Можно ли в диалоговом окне вывести кнопку «распахнуть» ?
По умолчанию в диалоговом окне есть только одна кнопка в заголовке – крестик «закрыть окно». А можно ли отобразить еще кнопки «распахнуть...

Как создать кнопку CButton и CEdit на стандартном диалоговом окне
Пожалуйста, подскажите как создать кнопку CButton и CEdit на стандартном диалоговом окне? В MSDN написано так: CButton myButton1; ...

Нажать на кнопку в окне
Здравствуйте, нужен скрипт, который бы нажимал на Button1 в окне Window1 если Button1 видима пользователю. Заранее благодарю!


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru