powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при обнаружении окна
25 сообщений из 35, страница 1 из 2
при обнаружении окна
    #38546779
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как сделать чтобы при обнаружении окна нажать энтер или кликнуть, только надо чтобы это окно не было видно или только чтобы мигнуло, можно такое ?
...
Рейтинг: 0 / 0
при обнаружении окна
    #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
при обнаружении окна
    #38547386
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

спасибо большое, а можно сделать ожидание окошка, и так чтобы все нажатия произошли так что вводимое окошко ели мигнуло, или вообще лучше чтобы не было
...
Рейтинг: 0 / 0
при обнаружении окна
    #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
при обнаружении окна
    #38547497
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy,

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

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

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

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

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

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

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

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

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

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

Да, действительно, можно осуществить функцию поиска окна без таймера, а при помощи Do While...Loop и DoEvents. Возможно опрос будет происходить даже чаще.
...
Рейтинг: 0 / 0
при обнаружении окна
    #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
при обнаружении окна
    #38549691
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код разместил по местам в прошлый проект, запускаю что то не получается. Тестировал на калькуляторе. Т.е запускаю калькулятор настраиваю чтобы при нажатии энтер менялась результат сложения к примеру, запускаю программу - по идее на калькуляторе должен меняться результат (т.е при нажатии на энтер, а этого не происходит). Вот проект
...
Рейтинг: 0 / 0
при обнаружении окна
    #38549693
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще не понял что означает едит из hwndex = FindWindowEx(hwnd, 0&, "Edit", "") , может для калькулятора другой))
...
Рейтинг: 0 / 0
при обнаружении окна
    #38549733
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ильшат190еще не понял что означает едит из hwndex = FindWindowEx(hwnd, 0&, "Edit", "") , может для калькулятора другой))

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

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

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

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

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


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