VB.NET нажатия кнопок в стороннем приложении

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

olesis
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 15.07.2008 (Вт) 10:17

VB.NET нажатия кнопок в стороннем приложении

Сообщение olesis » 16.08.2008 (Сб) 0:55

Всем привет, у меня такая проблема: нужно нажимать на кнопки в чужом окне, я получаю hwd нужного окна так:
Dim hwnd As Integer = FindWindow(vbNullString, "Заголовок окна")
заголовок получаю, всё нормально, а вот дальше я не знаю через какие API нажимать на кнопки/чекбоксы, через SendMessage? но как узнать ID кнопки/чекбокса которую нужно нажать/отметить? через Spy++ я могу посмотреть, а программно нет, вообщем помогите советом, на .NET почти нет инфы :(
P.S Все темы перечитал которые хоть как то относятся к этой теме, но там то на VB6 то не могу сообразить

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Joo » 16.08.2008 (Сб) 15:17

Я использовал следующие:
Код: Выделить всё
hWndParent= FindWindowA("TFormClean", "Заголовок родительского окна")
hWndChild= FindWindowExA(hWndParent, 0, "TBitBtn", "Текст кнопки")
PostMessageA(hWndChild, WM_KEYDOWN, VK_SPACE, vbNull)
PostMessageA(hWndChild, WM_KEYUP, VK_SPACE, vbNull)
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

olesis
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 15.07.2008 (Вт) 10:17

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение olesis » 16.08.2008 (Сб) 19:15

В принципе код работает, но только с одной кнопкой, я поискал инфу по API, как я понял нужно работать с
EnumWindows
EnumChildWindows
но пока все примеры на VB6, может есть у кого на .NET?

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Joo » 17.08.2008 (Вс) 4:56

В принципе не проблема с VB6 переложить на .NET, но описанным выше методом я кликал на несколько кнопок, выстовлял галочки!
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

olesis
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 15.07.2008 (Вт) 10:17

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение olesis » 17.08.2008 (Вс) 20:37

Можешь скинуть свои объявления используемых API?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Viper » 18.08.2008 (Пн) 7:14

Scarabey писал(а):Я использовал следующие:
Код: Выделить всё
hWndParent= FindWindowA("TFormClean", "Заголовок родительского окна")
hWndChild= FindWindowExA(hWndParent, 0, "TBitBtn", "Текст кнопки")
PostMessageA(hWndChild, WM_KEYDOWN, VK_SPACE, vbNull)
PostMessageA(hWndChild, WM_KEYUP, VK_SPACE, vbNull)
Scarabey, ты в курсе, что vbNull = 1? И использование данной константы в данном контексте, мягко говоря, некорректно?
Весь мир матрица, а мы в нем потоки байтов!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Joo » 22.08.2008 (Пт) 19:02

Верно подмеченно, что поделаеш я любитель упустил изи виду, но в принципе в данном примере это не играет решающей роли.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Joo » 22.08.2008 (Пт) 19:04

olesis писал(а):Можешь скинуть свои объявления используемых API?

Код: Выделить всё
Public Module API
    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function FindWindowA(ByVal ClassName As String, ByVal Windowtext As String) As Integer
    End Function

    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function FindWindowExA(ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal ClassName As String, ByVal Windowtext As String) As Integer
    End Function

    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function PostMessageA(ByVal hWnd As Integer, ByVal Message As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const VK_SPACE = &H20
End Module
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Viper » 23.08.2008 (Сб) 9:55

Scarabey писал(а):Верно подмеченно, что поделаеш я любитель упустил изи виду, но в принципе в данном примере это не играет решающей роли.
В контексте не играет, но вообще использование константы vbNull вместо NULL (NULL в API, в VB - 0&) является грубой ошибкой.
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Viper » 23.08.2008 (Сб) 9:59

Scarabey писал(а):
olesis писал(а):Можешь скинуть свои объявления используемых API?

Код: Выделить всё
Public Module API
    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function FindWindowA(ByVal ClassName As String, ByVal Windowtext As String) As Integer
    End Function

    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function FindWindowExA(ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal ClassName As String, ByVal Windowtext As String) As Integer
    End Function

    <System.Runtime.InteropServices.DllImport("USER32.DLL")> _
    Public Function PostMessageA(ByVal hWnd As Integer, ByVal Message As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const VK_SPACE = &H20
End Module
А почему используются ANSI-версии функций? По привычке VB6? Так при помощи атрибута System.Runtime.InteropServices.DllImport использование Unicode-версии API-функций становится легким и приятным.
Весь мир матрица, а мы в нем потоки байтов!

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: VB.NET нажатия кнопок в стороннем приложении

Сообщение Joo » 23.08.2008 (Сб) 13:09

Viper писал(а):А почему используются ANSI-версии функций? По привычке VB6? Так при помощи атрибута System.Runtime.InteropServices.DllImport использование Unicode-версии API-функций становится легким и приятным.

Да, все по привычке )) Да я их в принципе просто копировал из старых приложений при переносе.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 81

    TopList