powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при обнаружении окна
10 сообщений из 35, страница 2 из 2
при обнаружении окна
    #38550908
Фотография ильшат190
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyильшат190,

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

Почему то, вот в этом пункте почему то ноль пишет,
Код: 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.
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&, sName, vbNullString) ' тут пустая hwndex
        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&, "1234"
            
            SendMessage hwndex, WM_CHAR, 13, 0&
        End If
    End If
End If

DoEvents
Loop

End Sub



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

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNext = 2
Public Const GW_HWNDPREV = 3
Public Const GW_OWNER = 4
Public Const GW_CHILD = 5

'Добавить в форму:

Private Sub Command1_Click()
    Dim hwnd&
    Dim dummy&
    Dim strCaption$
    ' Очищает listbox
    List1.Clear
    ' Рабочий стол - самое первое окно
    hwnd& = GetDesktopWindow()
    ' Первое дочернее окно - окно первого уровня
    hwnd& = GetWindow(hwnd&, GW_CHILD)
    ' Теперь получим заголовки окон всех уровней
    Do
       dummy& = GetWindowTextLength(hwnd&)
       If dummy <> 0 Then
          strCaption = String(dummy + 1, " ")
          dummy = GetWindowText(hwnd&, strCaption, dummy + 1)
          List1.AddItem strCaption
       End If
       hwnd& = GetWindow(hwnd&, GW_HWNDNEXT)
    Loop While hwnd& <> 0
End Sub



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

Нарушением правил форума пахнет.
Администраторы спят?
...
Рейтинг: 0 / 0
при обнаружении окна
    #38551041
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timtim, есть кнопка "сообщить модератору" - не заметил?

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

Нарушением правил форума пахнет.
Администраторы спят?


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

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

Почему то, вот в этом пункте почему то ноль пишет,
Код: 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.
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&, sName, vbNullString) ' тут пустая hwndex
        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&, "1234"
            
            SendMessage hwndex, WM_CHAR, 13, 0&
        End If
    End If
End If

DoEvents
Loop

End Sub



проект прикрепил

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

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

основное окно приложения,

Сомневаюсь, что sName одинаковое для основного и всплвыающего окна. Почитайте все-таки про классы окон.

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

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

Вот форма:
Код: 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.
Private Sub Timer1_Timer()
Модуль1.hwnd = GetDesktopWindow()
Модуль1.hwnd = GetWindow(Модуль1.hwnd, GW_CHILD)
Do
Модуль1.dummy = GetWindowTextLength(Модуль1.hwnd)
If Модуль1.dummy <> 0 Then
Модуль1.strCaption = String(Модуль1.dummy + 1, " ")
Модуль1.dummy = GetWindowText(Модуль1.hwnd, Модуль1.strCaption, Модуль1.dummy + 1)
frmmain.Text1.Text = frmmain.Text1.Text + Модуль1.strCaption
End If
Модуль1.hwnd = GetWindow(Модуль1.hwnd, GW_HWNDNext)

If InStr(1, Модуль1.strCaption, "Вопрос") <> 0 Then

Dim lngX As Single, lngY As Single

lngX = Screen.Width / Screen.TwipsPerPixelX
lngY = Screen.Height / Screen.TwipsPerPixelY
Call SetCursorPos(lngX / 2, lngY / 2)
MouseClick btcLeft
Call keybd_event(VK_RETURN, 0, 0, 0)
Call keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
End
End If

Loop While Модуль1.hwnd <> 0


End Sub



Вот модуль:
Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
'bVk - Виртуальный код клавиши для имитации нажатия и отпускания клавиши.
'bScan - Зарезервировано -- установлено в 0.
'dwFlags - Комбинация следующих флагов определяет различные способы имитации:
'KEYEVENTF_EXTENDEDKEY - Префикс скэн-кода с префиксным байтом, имеющим значение &HE0.
'KEYEVENTF_KEYUP - Клавиша, указанная в bVk будет отпущена. Если этот флажок не определен, клавиша будет нажата.
'dwExtraInfo - Дополнительное 32-разрядное значение, связанное с событием клавиатуры.
Public Const KEYEVENTF_KEYUP = &H2 'событие отпускания клавиши
Public Const VK_LWIN = &H5B  'левая клавиша, эмулирующая нажатие кнопки ПУСК
Public Const VK_F1 = &H70
Public Const VK_RETURN = &HD




Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal r As Long, ByVal r1 As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cbuttons As Long, ByVal dwExtraInfo As Long)

Public Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNext = 2
Public Const GW_HWNDPREV = 3
Public Const GW_OWNER = 4
Public Const GW_CHILD = 5

Public hwnd As String
Public dummy As String
Public strCaption As String
Public hw As String


Public Enum enButtonToClick
btcLeft
btcRight
btcMiddle
End Enum

Public Sub MouseClick(ByVal MBClick As enButtonToClick)

Dim cbuttons As Long, dwExtraInfo As Long, mevent As Long
Select Case MBClick
Case btcLeft
mevent = MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP
Case btcRight
mevent = MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP
Case btcMiddle
mevent = MOUSEEVENTF_MIDDLEDOWN Or MOUSEEVENTF_MIDDLEUP
Exit Sub
End Select
Call mouse_event(mevent, 0&, 0&, cbuttons, dwExtraInfo)
End Sub

Public Sub MouseMove(ByRef X As Long, ByRef Y As Long)
Dim cbuttons As Long, dwExtraInfo As Long
Call mouse_event(MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, X, Y, cbuttons, dwExtraInfo)
End Sub





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


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