Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
1

Авторизация в стороннем приложении

07.12.2015, 18:06. Показов 1492. Ответов 19
Метки нет (Все метки)

Всем привет ,
Я студент, решил углубиться в мир программирования и взял свой курс на освоение VBA and VBS.(как первый язык я думаю пойдет не плохо , с учетом того что в школьном курсе , да и на первом курсе университета работали в нем)
Решил написать простенький код для автологина в программу.
Авторизация в стороннем приложении

схема проста :
Есть сторонний процес -- он запрашивает данные по-очередно , с начало login а потом и password
Есть наша программа
Авторизация в стороннем приложении
-- вбиваем туда данные (заполняем TextBox-ы) и при нажатии кнопки пуск (вызывается exe) , эти данные должны вбиться в наш процесс , после чего он должен свернуться.
соответственно уже реализовал считывание из файла и запись данных


vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim fileReader =
My.Computer.FileSystem.OpenTextFileReader("data.txt")
        Dim stringReader1 = fileReader.ReadLine()
        Dim stringReader2 = fileReader.ReadLine()
        TextBox1.Text = stringReader1
        TextBox2.Text = stringReader2
        FileClose()
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If CheckBox1.Checked = True Then
            Dim file As System.IO.StreamWriter
            file = My.Computer.FileSystem.OpenTextFileWriter("data.txt", False)
            file.WriteLine(TextBox1.Text)
            file.WriteLine(TextBox2.Text)
            file.Close()
            Close()
        Else
            Close()
        End If
сам запуск exe
vb.net
1
2
3
4
5
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim procID As Integer
        ' Запускаем EXE.
        procID = Shell("OBS.exe", AppWinStyle.NormalFocus)
        ' Программа лежит в томже катологе.
Вопрос , как мне теперь импортировать мои текст боксы ?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2015, 18:06
Ответы с готовыми решениями:

Нажатие клавиш в стороннем приложении
всем привет вообщем ребят с програмированием начал заниматся всего неделю :) написал пару простых...

Можно ли программно изменить ресурсы в стороннем приложении
Я уже спрашивал про добавление ресурсов в программу которая запущена. Мне ответили что это...

Авторизация в моём приложении, используя ad-пользователя
Здравствуйте. Задумал я тут добавить возможность авторизации в моём приложении, используя...

Перехват события в стороннем приложении
Доброго всем. Помогите плиз, есть программа (скомпилированная, исходников нет), в которой после...

19
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
07.12.2015, 18:44 2
vovankrot, используй WinApi: FindWindowEx, SendMessage...
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
07.12.2015, 19:04  [ТС] 3
Я так понял надо описать в методах
FindWindowEx, SendMessage.
, описания брать в документации по winAPI, вопрос , будет ли это работать в не зависимости от типа системы (x64 or x86)
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
07.12.2015, 19:24 4
vovankrot, будет работать и на x64 и на x86... эту функции на обеих системх одинаково себя ведут.

Добавлено через 4 минуты
А вообще тут и SendKeys() вполне хватит... форма то известная и можно подогнать.
Но в идеале конечно вышеуказанные функии использовать лучще.
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
07.12.2015, 19:25  [ТС] 5
Отлично , почитал я про SendMessage, и так понял , что отправляет оно константу т.е. любую клавишу , когда мне надо отправить определенный текст , который еще и меняется пользователем(в нашей форме)
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
07.12.2015, 19:36 6
Он не клавишу отправляет а именно ТЕКСТ если использьзовать соответствующие константы сообщений, например WM_SETTEXT или WM_GETTEXT

Добавлено через 1 минуту
WM_MOUSEDOWN и WM_MOSEUP посылает клик мышкой.

Добавлено через 3 минуты
Тоесть ты со своей формы с текстбоксами решил послать в стороннее приложение текст? А это стороннее приложение не консольное случайно?

Добавлено через 1 минуту
Если консоль то тебе и SendKeys() вполне хватит...

Добавлено через 1 минуту
А точнее WinAPI SetForegroundWindow и бэйсиковая SendKeys()
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
07.12.2015, 20:58  [ТС] 7
А не могли бы вы накидать примеров )
Просто я объявил
vb.net
1
2
3
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) 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
Дальше я пытаюсь вставить текст из первого текстбокса
vb.net
1
2
3
4
Dim OBS As Integer
        OBS = Shell("OBS.exe", AppWinStyle.NormalFocus)
        g = FindWindow(vbNullString, "OBS.exe")
        SendMessage(TextBox1.Text, &HC, 0, "")
Ругает что нельзя засунуть мой текст в лонг, надо значит в стринг ?
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
07.12.2015, 21:32 8
Нет это вы взяли объявления из старого бэйсика. Все лонги переделайте в Integer
И во вторых неправильно используете эти функции... я уже убегаю отсюда. Завтра если только расскажу как это делается...
Вы на прошлый пост мне ответьте пока.

Добавлено через 2 минуты
И перепроверьте какие параметры нужно передать в SendMessage и для чего нужна здесь FindWindow?

Добавлено через 1 минуту
И в .NET нету типа переменной Any, поишите, не поленитесь как обьявлять Api в VB.NET
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
08.12.2015, 07:23  [ТС] 9
Да программа представляет из-себя что наподобие консоли , спасибо за советы )

Добавлено через 9 часов 33 минуты
Чутка подправил само API
vb.net
1
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
Нашел в литературе только такой способ объявления , зы: использую комньюнити 2015.
И подправил саму отправку
vb.net
1
SendMessage(g, TextBox1.Text, 1, IntPtr.Zero)
(я так понял g - окно программы, текст, дополнительный параметр , дополнительный параметр)
но что именно туда можно запихивать, в эти параметры?)

Добавлено через 59 секунд
параметры вбил на обум ХД, естественно выдало ошибку переполнения.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 10:30 10
Лучший ответ Сообщение было отмечено vovankrot как решение

Решение

В SendMessage первым параметром отправляете Handle окна, тоесть, то что получили в переменную "g", вторым параметром сообщение окну или классу (кнопке, текстовому полю и тд (тоесть константа WM_SETTEXT), и уже третим сам текст, четверты параметре здесь будет "0" ...

Добавлено через 3 минуты
Но учтите что таким макаром вы окно не найдете
vb.net
1
g = FindWindow(vbNullString, "OBS.exe")
здесь второй параметр должен быть идентичен щаголовку окна того самого стороннего приложения, а если речь о кнопке, то в первом параметре нужно указать КЛАСС того самого текстового поля.

Вобщем для консоли, как я и говорит уже, вам хватит использования SendKeys()
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
08.12.2015, 16:59  [ТС] 11
Еще раз привет
Я так понял SetForegroundWindow возвращает хэндл нашего активного окна
Описал я его так
vb.net
1
2
3
4
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function SetForegroundWindow(ByVal hwnd As String) As String
    End Function
' я таки нашел удобный вызов апи , надо правдо не забыть вставить Imports System.Runtime.InteropServices
Почему стринг ? Я думаю хендл активного окна возвратиться его названием
vb.net
1
2
3
4
5
Dim OKNO As String
OKNO = SetForegroundWindow("OBS.exe") 
' в моем представлении здесь мы получили хэндл окна
SendMessage(OKNO, &HC, TextBox1.Text, 0) 
' послали в окно наш текст из текстбокса
Ах да , новый SendMessage
vb.net
1
2
3
4
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function SendMessage(ByVal hwnd As String, ByVal wMsg As Integer, ByVal wParam As String, ByVal lParam As IntPtr) As Integer
    End Function
' Отрегулировал переменные
Результат = открытое окно и все
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 17:14 12
Лучший ответ Сообщение было отмечено vovankrot как решение

Решение

Все напутали... Если не понимаете, есть ведь гугл, он точно вам подскажет какие функции что возвращают и как с ними работать...
SetForegrounWindow имеет очень говорящее название... Она переносит нужное нам окно на передний план и делает активным, чтобы затем послать в него текст или нажатие клавиши через SendKeys()
Это один из вариантов ее использования.

Добавлено через 1 минуту
И еще вот здесь hwnd что означает по вашему мнению?
vb.net
1
SetForegroundWindow(ByVal hwnd As String)
1
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 18:08 13
vovankrot, вот пример с SendKeys()
Кликните здесь для просмотра всего текста
vb.net
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
Imports System.Runtime.InteropServices
Public Class Form1
 
#Region "    WinAPI"
    Public Declare Function FindWindow Lib "user32.DLL" Alias "FindWindowA" (
    ByVal lpClassName As String,
    ByVal lpWindowName As String) As Integer
 
    Public Declare Function SendMessage Lib "user32.DLL" Alias "SendMessageA" (
    ByVal hwnd As Integer,
    ByVal wMsg As Integer,
    ByVal wParam As Integer,
    <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
 
    Public Declare Function SetForegroundWindow Lib "user32.DLL" Alias "SetForegroundWindow" (
    ByVal hwnd As Integer) As Integer
 
    Public Const WM_SETTEXT As Integer = &HC
 
#End Region
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
 
        Label2.Tag = FindWindow(vbNullString, "Командная строка") 'получаем Handle окна
 
        Label2.Text = "Handle: " & Label2.Tag 'показываем нам найденный Handle
 
    End Sub
 
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        'SendMessage(Label2.Tag, WM_SETTEXT, IntPtr.Zero, TextBox1.Text) - с консолью не работает почемуто
 
        SetForegroundWindow(Label2.Tag) 'перемещаем окно на передний план
        SendKeys.Send(TextBox1.Text) 'посылаем  текст в окно
 
    End Sub
End Class
3
Миниатюры
Авторизация в стороннем приложении  
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 18:09 14
Лучший ответ Сообщение было отмечено vovankrot как решение

Решение

если внимательно разберете код, я вам правильное объявление нужных вам WinApi добавил и названия параметров говорят за себя... не нуждаясь в объяснениях
1
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
08.12.2015, 18:37  [ТС] 15
Я на самом деле уже сделал без апи Хд
Решил как вы и говорили попробывать SendKeys.Send
vb.net
1
OBS = Shell("C:\OBS\OBS.exe", AppWinStyle.NormalFocus)
Благодаря параметру запуска оно у меня сразу входит в фокус
vb.net
1
SendKeys.Send("Любой текст")
Но всеравно спасибо ) было приятно покопаться.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 18:56 16
SendKeys поможет в других решениях... Я тут описал как это делается.

Добавлено через 3 минуты
Цитата Сообщение от vovankrot Посмотреть сообщение
Благодаря параметру запуска оно у меня сразу входит в фокус
а что будет если вы перейдете снова в окно своего приложения и заходите сменить комбинацию "имя и пароль" и переотправить в ваше уже открывшееся окно? Все.... фокус уже потерян.... для этого я и добавил Апи SetForegroundWindow и FindWindow

Добавлено через 2 минуты
кстати послать нажатие клавиши например Enter через SendKeys нужно заключив слово Enter в фигурные скобки...

vb.net
1
SendKeys.Send("{Enter}")
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
08.12.2015, 20:00  [ТС] 17

vb.net
1
2
3
4
5
OBS = Shell("OBS.exe", AppWinStyle.NormalFocus)
        SendKeys.Send(TextBox1.Text)
        SendKeys.Send("{ENTER}")
        SendKeys.Send(TextBox2.Text)
        SendKeys.Send("{ENTER}")
Он начинает бесконечно запускать экзешник, куда я попал Хд?

Добавлено через 18 минут
А теперь опять нормально работает, просто пушка.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
08.12.2015, 20:53 18
А зачем вы Shell используете? Есть же
vb.net
1
Process.Start("OBS.exe")
0
0 / 0 / 0
Регистрация: 07.12.2015
Сообщений: 9
09.12.2015, 00:43  [ТС] 19
Тем кто наткнется на мою тему
Кликните здесь для просмотра всего текста
Информация по языку - https://msdn.microsoft.com/ru-ru/library/
Когда вы посылаете SendKeys , то надо помнить что это эмуляция нажатия клавиш т.е команда всегда посылается в активное окно. Методы описаны выше, в моем случае программа грабится или с помощью Spy++ или когда вы вызываете ее методом Shell - она запускается не мгновенно , я ставил задержку перед отправкой
vb.net
1
2
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As IntPtr)
Sleep(Число в миллисекундах)

Тему можно закрывать , все работает )
Огромное спасибо Юрию.
0
Модератор
Эксперт .NET
3253 / 2914 / 448
Регистрация: 27.01.2014
Сообщений: 5,398
09.12.2015, 04:41 20
vovankrot, на засыпку... Не стоит пользоваться WinAPI если есть ее аналог в VB.NET, а насчет Shell и Sleep - они есть... Вот они:

vb.net
1
2
3
Process.Start("OBS.exe") 'аналог Shell имеющий намного больше возможностей, в плоть до получения соержимого Консольного окна, чтобы отлавливать в ней сообщения.
 
Threading.Thread.Sleep(Число в миллисекундах) 'аналог Sleep (тормозить полностью поток, из которого вызывается функция

Не по теме:

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

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2015, 04:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Нажатие кнопок в стороннем приложении
------------------------------------ public void button1_Click(object sender, EventArgs e) ...

Заменить курсор в стороннем приложении
Есть стороннее win32 приложение, в котором есть свой кастомный курсор. Нужно посредством c++ скрыть...

Отлов клавиш в стороннем приложении
нужен простой пример: допустим в форме1 есть текст1 и кнопка1 нужно нажатием кнопки запустить...

Изменение данных в стороннем приложении
А у меня вот такой вопрос запущенна левая программа, в ней я изменяю значение через cheat engine...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.