Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при обнаружении окна / 25 сообщений из 35, страница 1 из 2
03.02.2014, 08:20
    #38546779
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
как сделать чтобы при обнаружении окна нажать энтер или кликнуть, только надо чтобы это окно не было видно или только чтобы мигнуло, можно такое ?
...
Рейтинг: 0 / 0
03.02.2014, 14:56
    #38547254
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Не совсем понятно, что именно требуется, тем не менее.

При помощи вот этой функции можно получить handler окна:

Код: vbnet
1.
2.
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
                 ByVal lpWindowName As String) As Integer



Вот эта функция может отправлять команду окну, например, закрыть:

Код: vbnet
1.
2.
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Integer, Msg As Long, _
wParam As Long, lParam As Long) As Boolean
...
Рейтинг: 0 / 0
03.02.2014, 16:29
    #38547386
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

спасибо большое, а можно сделать ожидание окошка, и так чтобы все нажатия произошли так что вводимое окошко ели мигнуло, или вообще лучше чтобы не было
...
Рейтинг: 0 / 0
03.02.2014, 17:06
    #38547429
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Можно вызывать функцию поиска окна каждые 15,6 миллисекунд, при помощи таймера, указанного ниже, но решение задачи, с помощью постоянных опросов, получения handle окна и его закрытия, выглядит иррациональным. Чтобы найти более оптимальный подход, необходимо знать почему возникла необходимость работать с окнами таким образом.

Код: vbnet
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.
Option Explicit

Public Declare Function SetTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
 
Public Declare Function KillTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long

Private m_TimerID As Long
 
Public Sub StartTimer(ByVal Duration As Long)
    If m_TimerID = 0 Then
        If Duration > 0 Then
            m_TimerID = SetTimer(0, 0, Duration, AddressOf TimerEvent)
            If m_TimerID = 0 Then
                MsgBox "Timer initialization failed!"
            End If
        Else
            MsgBox "The duration must be greater than zero."
        End If
    Else
        MsgBox "Timer already started."
    End If
End Sub
 
Public Sub StopTimer()
    If m_TimerID <> 0 Then
        KillTimer 0, m_TimerID
        m_TimerID = 0
    Else
        MsgBox "Timer is not active."
    End If
End Sub
 
Public Property Get TimerIsActive() As Boolean
    TimerIsActive = (m_TimerID <> 0)
End Property
 
Private Sub TimerEvent()
    Debug.Print "Timer event fired: "; Format$(Now, "long time")
    StopTimer 'Comment out if timer should run all the time.
    'Your code here.
End Sub

...
Рейтинг: 0 / 0
03.02.2014, 17:49
    #38547497
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

спасибо большое за код
...
Рейтинг: 0 / 0
03.02.2014, 18:07
    #38547529
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
к примеру у меня программа регистрации требует, она каждые n-минут выкидывает окошко с просьбой купить, надо его переодически при появление без показа и вмешательства юзеру закрывать, я решил на vb решить, но люди говорят еще с перехватом функций можно сделать, и говорят это будет правильнее
...
Рейтинг: 0 / 0
03.02.2014, 18:55
    #38547615
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190к примеру у меня программа регистрации требует, она каждые n-минут выкидывает окошко с просьбой купить, надо его переодически при появление без показа и вмешательства юзеру закрывать, я решил на vb решить, но люди говорят еще с перехватом функций можно сделать, и говорят это будет правильнее

Тогда возможно пригодится эта ссылка .
...
Рейтинг: 0 / 0
03.02.2014, 22:39
    #38547845
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
Что то я с кодом таймера таки не разобрался, даже комментарии перевел все равно не понял его работу, вот мой проект http://rghost.ru/52184914 , кстати там еще почему то закрытие не работает, а твой код таймера ошибку выдает, и еще вопрос такой , почему минимальный интервал за 5милисекунд взял меньше нельзя что ли ?
...
Рейтинг: 0 / 0
04.02.2014, 00:18
    #38547919
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,
...
Рейтинг: 0 / 0
04.02.2014, 01:13
    #38547935
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Интервал таймера можно задать меньше 15 мсек, но это ничего не даст, т.к. это будет меньше точности таймера.
...
Рейтинг: 0 / 0
04.02.2014, 15:03
    #38548718
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidyильшат190,

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

Еще такой вопрос, можно ли сделать чтобы при появлении окна, на этом окне нажималась кнопка (элемент интерфейса), или если так не получиться то можно ли клик именно на эту кнопку?
...
Рейтинг: 0 / 0
04.02.2014, 15:22
    #38548770
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190iMrTidyильшат190,

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

Еще такой вопрос, можно ли сделать чтобы при появлении окна, на этом окне нажималась кнопка (элемент интерфейса), или если так не получиться то можно ли клик именно на эту кнопку?

Не зная какие манипуляции требуются, сложно ответить на вопрос, но тем не менее, вот здесь список всех сообщений, которые можно отправить окну, в том числе такие как нажатие клавиш клавиатуры и мыши, так и движения мыши.
...
Рейтинг: 0 / 0
04.02.2014, 15:42
    #38548821
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

Манипуляции:
при появлении окна, нажать на кнопку в этой окне
// желательно без координат так как это не стабильный, не надежный вариант
...
Рейтинг: 0 / 0
04.02.2014, 18:32
    #38549200
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

вот проект, там чуть изменил/доработал теперь можно указывать только часть заголовка,
но одну задачу не смог сделать всё таки.
Надо немножко заменить цель, надо не закрывать программу а посылать на окно нажатие кнопки "Энтер" можно такое, подскажи пожалуйста
...
Рейтинг: 0 / 0
04.02.2014, 18:33
    #38549205
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
вот тебе в помощь, http://www.rusedu.info/index.php?module=News&catid=&topic=18 , я сам прочитал таки не смог чтобы нажимала именно "энтер" именно в том окне
...
Рейтинг: 0 / 0
05.02.2014, 00:53
    #38549533
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Да, действительно, можно осуществить функцию поиска окна без таймера, а при помощи Do While...Loop и DoEvents. Возможно опрос будет происходить даже чаще.
...
Рейтинг: 0 / 0
05.02.2014, 02:04
    #38549578
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190iMrTidy,

вот проект, там чуть изменил/доработал теперь можно указывать только часть заголовка,
но одну задачу не смог сделать всё таки.
Надо немножко заменить цель, надо не закрывать программу а посылать на окно нажатие кнопки "Энтер" можно такое, подскажи пожалуйста

Будет полезным познакомиться с классами окон Windows . Рискну предположить, что всплывающее окно должно закрываться без закрытия приложения. Клавишу Enter можно посылать, но нужно знать куда. Например, применительно к Notepad, код ниже будет работать, и для Enter и для "hello", но вот ничего не даст при использовании KeyDown/KeyUp. Дело в том, что в первых двух случаях, отправляются символы в окно "Edit" приложения "Notepad", в то время как третий, отправляет события нажатия и отпускания клавиш, при этом целевое окно должно быть keyboard focus.

Код: vbnet
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.
Option Explicit

Public 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 Integer, ByVal lParam As Any) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, _
                ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Private Const WM_CLOSE As Long = &H10
Private Const WM_KEYUP As Long = &H101
Private Const WM_KEYDOWN As Long = &H100
Private Const VK_RETURN As Long = &HD
Private Const WM_SETFOCUS As Long = &H7
Private Const WM_ACTIVATE As Long = &H6
Private Const WM_KILLFOCUS As Long = &H8
Private Const WM_SETTEXT As Long = &HC
Private Const WM_CHAR As Long = &H102

Public Sub CheckWindow()

Dim hwnd As Long
Dim hwndex As Long
Dim sName

Do While Not bStop

sName = frmMain.txtAppName.Text

If LenB(sName) <> 0 Then
    hwnd = FindWindow(vbNullString, sName)
    If hwnd <> 0 Then
        hwndex = FindWindowEx(hwnd, 0&, "Edit", "")
        If hwndex <> 0 Then
            'SendMessage hwndex, WM_ACTIVATE, 1&, 0&
            'SendMessage hwndex, WM_SETFOCUS, 0&, 0&
            'SendMessage hwndex, WM_KEYDOWN, VK_RETURN, 1&
            'SendMessage hwndex, WM_KEYUP, VK_RETURN, 1&
            
            'SendMessage hwndex, WM_SETTEXT, 0&, "hello"
            
            SendMessage hwndex, WM_CHAR, 13, 0&
        End If
    End If
End If

DoEvents
Loop

End Sub

...
Рейтинг: 0 / 0
05.02.2014, 09:26
    #38549691
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
Код разместил по местам в прошлый проект, запускаю что то не получается. Тестировал на калькуляторе. Т.е запускаю калькулятор настраиваю чтобы при нажатии энтер менялась результат сложения к примеру, запускаю программу - по идее на калькуляторе должен меняться результат (т.е при нажатии на энтер, а этого не происходит). Вот проект
...
Рейтинг: 0 / 0
05.02.2014, 09:28
    #38549693
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
еще не понял что означает едит из hwndex = FindWindowEx(hwnd, 0&, "Edit", "") , может для калькулятора другой))
...
Рейтинг: 0 / 0
05.02.2014, 10:06
    #38549733
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190еще не понял что означает едит из hwndex = FindWindowEx(hwnd, 0&, "Edit", "") , может для калькулятора другой))

Это подокно Notepad, где отображается текст. Для калькулятора свой.
...
Рейтинг: 0 / 0
05.02.2014, 11:49
    #38549933
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,
...
Рейтинг: 0 / 0
05.02.2014, 11:50
    #38549934
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

есть программа1 она создает дополнительное окно , (окно выглядит как обычные программы) , это окно в диспетчере процессов не получается увидеть, а вот в диспетчере "заголовков приложений" видно, если в нём нажать перейти к процессу то переходит на процесс csrss.exe , как получить handle этого окна по названию? Обычный способ не находит.
...
Рейтинг: 0 / 0
05.02.2014, 12:39
    #38550043
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Строго говоря, получение handle окна не зависит от поведения программы. О каком "обычном способе" идет речь?
...
Рейтинг: 0 / 0
05.02.2014, 12:50
    #38550063
ильшат190
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
iMrTidy,

вот к примеру твой проект, с него не находит по заголовку, хотя в диспетчере приложений видно что она запущена
...
Рейтинг: 0 / 0
05.02.2014, 13:17
    #38550131
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при обнаружении окна
ильшат190,

Возможно, потому что это подокно приложения, тогда можно попробовать воспользоваться моим последним примером.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при обнаружении окна / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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