Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Клик по кнопке на окне


Автор: ProgramerForever 20.3.2008, 18:52
Я прекрасно понимаю, что тема избитая. но всё равно не выходит.
Код

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 hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 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


Const BM_CLICK = &HF5
 

Private WndWind As Long ' Описатель окна




Private Sub Timer1_Timer()
    WndWind = FindWindow("Ошибка сценария Internet Explorer", vbNullString) 'Ищем окно
    MsgBox Str(WndWind)'ПОЛУЧАЕТСЯ 0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    If WndWind <> 0 Then
        WbdButton = FindWindowEx(WndWind, 0, "&Нет", vbNullString) 'Ищем кнопку на окне
        Call SendMessage(WbdButton, BM_CLICK, 0, 0) 'Клик
    End If
End Sub

Автор: I_Am_Rock 20.3.2008, 19:10
Надо просто поменять местами - сначала идет класс, затем заголовок... smile

Код

WndWind = FindWindow(vbNullString, "Свойства обозревателя")


Добавлено через 1 минуту и 51 секунду
Ой! - я тестил на Свойствах обозревателя. Не забудь заменить заголовок...

Добавлено через 7 минут и 35 секунд
Кстати - с поиском кнопки кажется также надо сделать...

Автор: ProgramerForever 20.3.2008, 19:18
Кнопку Нет не находит

Автор: I_Am_Rock 20.3.2008, 19:23
Насчет кнопки - см. выше

Автор: ProgramerForever 20.3.2008, 19:27
Не выходит

Автор: I_Am_Rock 20.3.2008, 19:29
Скажи, как мне вызвать это окно (Ошибка сценария Internet Explorer) - и я потестю...

Автор: ProgramerForever 20.3.2008, 19:31
грузи сайт любой. Со скриптом.

Добавлено через 7 минут и 28 секунд
А если просто пробел или ввод на окно кидать?

Автор: I_Am_Rock 20.3.2008, 19:47
Цитата(ProgramerForever @ 20.3.2008,  19:31)
грузи сайт любой. Со скриптом.

Добавлено @ 19:38
А если просто пробел или ввод на окно кидать?


Опиши подробно - как вызвать это окно. А то я не догнал.  smile 

И попробуй пока убрать амперсанд (&)

Автор: ProgramerForever 20.3.2008, 19:52
Оно появляется, когда IE находит синтаксическую ошибку в коде страницы. Запусти корявый скрипт какой-нибудь

Автор: I_Am_Rock 20.3.2008, 20:10
Никак не могу сделать корявый скрипт! Наверное, я слишком талантливый программист.smile
Напиши мне "корявый скрипт" (полностью, с html)

Вообще-то я добиваюсь этого, но лишь отображения с ошибками, т.е. никакие окна не открываются...

Автор: ProgramerForever 20.3.2008, 20:20
Да я сам не могу. Уже всё перепробовал.

(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
Что такое hWnd1 и hWnd2? lpsz1 и lpsz2?

Может через sendmessage отправлять Esc? Так тоже пойдёт. Скажи код Esc.

Автор: I_Am_Rock 20.3.2008, 20:28
Цитата(ProgramerForever @ 20.3.2008,  20:20)
Да я сам не могу. Уже всё перепробовал.

(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String)
Что такое hWnd1 и hWnd2? lpsz1 и lpsz2?

Может через sendmessage отправлять Esc? Так тоже пойдёт. Скажи код Esc.

Ты кажется не понял - я не могу скрипт "корявый" сделать... Если бы я видел само окно, я бы разобрался.

А как ты хочешь отправить Esc через СендМесседж? Я умею только через КейбдЕвент...

Вот виртуальный код Эскейпа - (VK_ESCAPE = &H1B)

Добавлено через 2 минуты и 1 секунду
А эта кнопка Нет случайно не находится ни в каком фрейме? Просто, если она наход. в рамке, то сначала нужно найти окно, потом рамку, потом только кнопку...

Автор: ProgramerForever 20.3.2008, 20:31
Вот так:
Код


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 hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 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
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Const VK_esc = 27
Const KEYEVENTF_KEYUP = &H2
Const BM_CLICK = &HF5

Private WndWind As Long ' Îïèñàòåëü îêíà


Private Sub Form_Load()
    Me.Hide
End Sub

Private Sub Timer1_Timer()
    WndWind = FindWindow(vbNullString, "Îøèáêà ñöåíàðèÿ Internet Explorer") 'Èùåì îêíî
    If WndWind <> 0 Then
        WbdButton = FindWindowEx(WndWind, 0, "&Íåò", vbNullString) 'Èùåì êíîïêó íà îêíå
        
        SetWindowPos WndWind, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
        keybd_event VK_esc, 0, 0, 0
        keybd_event VK_esc, 0, KEYEVENTF_KEYUP, 0
        SetWindowPos WndWind, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
        
        'Beep
    End If

    WndWind = FindWindow(vbNullString, "Îøèáêà") 'Èùåì îêíî
    If WndWind <> 0 Then
        WbdButton = FindWindowEx(WndWind, 0, "Íåò", vbNullString) 'Èùåì êíîïêó íà îêíå

        SetWindowPos WndWind, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
        keybd_event VK_esc, 0, 0, 0
        keybd_event VK_esc, 0, KEYEVENTF_KEYUP, 0
        SetWindowPos WndWind, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE

    End If
End Sub


Хотя бы так...

Добавлено через 1 минуту и 43 секунды
Цитата(I_Am_Rock @  21.3.2008,  00:28 Найти цитируемый пост)
сначала нужно найти окно, потом рамку, потом только кнопку...

Да. я знаю, что так.

Автор: I_Am_Rock 20.3.2008, 21:01
А почему в этом коде "&Нет" и "vbNullString" опять не на своих местах? Неужели так работает? Не понимаю...

Автор: JusTalionis 20.3.2008, 22:12
Ребят, Бог вам в помощь, но ваще-т в IE есть соответствующие галочки, чтобы не вызывался этот отладчик... У меня он тоже на каждом сайте выскакивал, я отменил в "Свойствах обозревателя"\Дополнительно... кажется...
Две галочки там на эту тему.


Автор: I_Am_Rock 21.3.2008, 00:35
JusTalionis, это-то понятно - но ProgramerForever пишет нейтрализатор отладчика IE... т.е. не для себя... Как же он на VB отключит галочки в настройках?.. Хотя, наверное, это возможно сделать...

Автор: ProgramerForever 21.3.2008, 05:05
Если бы отменялось, я бы был бы счастлив. Но IE, наивный, упорно показывает отладчик.

Автор: ProgramerForever 21.3.2008, 20:44
Нет, опять не работает. У кого есть описание на русском FindWindowExA?

Автор: I_Am_Rock 22.3.2008, 00:55
Да с этим все правильно (если ты переместил, как я советовал).
Вот, например, как ищется по классу кнопка Пуск (hParent - панель задач)

Код

hChild = FindWindowEx(hParent, 0, "Button", vbNullString)    ' находим хэндл кнопки


Ты же хочешь искать по заголовку, т.е  где здесь vbNullString, у тебя - заголовок в кавычках. А где здесь "Button", там у тебя должно быть vbNullString. В принципе можешь определить класс кнопки и заодно его вписать (типа - на всякий случай smile )

Автор: ProgramerForever 22.3.2008, 04:30
Цитата(I_Am_Rock @  22.3.2008,  04:55 Найти цитируемый пост)
 В принципе можешь определить класс кнопки 

Что такое класс кнопки? И как его определить?

Автор: Rrader 22.3.2008, 11:22
Пример в аттаче.

Автор: I_Am_Rock 22.3.2008, 12:22
Класс можно определить с помощью InqSoft Sign of Misery (легко найти в инете и "весит" мало)

Автор: Akina 22.3.2008, 21:14
 smile Вот мучает меня вопрос - ну почему для решения задачи (поставленной в заголовке топа) изначально не был установлен запрет отладки сценариев в настройках Internet Explorer...

Автор: ProgramerForever 22.3.2008, 23:00
Akina, запрет был выставлен. Но броузеру до лампочки, он опять предлагает свой навязчивый сервис отладки

Автор: JusTalionis 23.3.2008, 10:05
Для IE6 (родной XP): "Сервис"\"Свойства обозревателя"\"Дополнительно", в секции "обзор" (это ближе к концу списка): "Отключить отладку сценариев IE" - эта галочка должна стоять. А еще пониже - "Показывать уведомление о каждой ошибке сценария" - этой галочки быть не должно! Проверил?
Так у тя выставлено?

Автор: ProgramerForever 24.3.2008, 08:13
Да, так.

Оффтопик. Раз про IE начали говорить... Как через WebBrowser сёрфить странички через прокси? Причём одновременно несколько экземпляров WebBrowser'a - с разными проксями.

Автор: Akina 24.3.2008, 09:52

M
Akina
Один топик - один вопрос.

Автор: ProgramerForever 8.4.2008, 14:43
Вопрос до сих пор не решён.. 

Выкладываю пример кода. выдающего ошибку...
Код

<script LANGUAGE="Javascript" >as=d</SCRIPT>

Открываем в WB, а не в IE.

Автор: bom 8.4.2008, 16:25
На, развлекайся.
Код

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Command1_Click()
PostMessage FindWindow("Internet Explorer_TridentDlgFrame", vbNullString), &H10, 0&, 0&
End Sub

Автор: ProgramerForever 9.4.2008, 12:57
bom, не работает, к сожалению. У меня вылетает такое окно:
http://ipicture.ru/

Автор: bom 9.4.2008, 14:10
И не должно. Это не окно стандартного отладчика IE, о котором речь шла в предыдущих сообщениях.
Похоже на диалог Microsoft Script Debugger-а или Редактора Web-сценариев из пакета MS Office.

Автор: ProgramerForever 9.4.2008, 16:12
А как его убивать?

Автор: Rrader 9.4.2008, 16:20
Код

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Command1_Click()
PostMessage FindWindow("#32770", "Ошибка"), &H10, 0&, 0&
End Sub

Автор: ProgramerForever 9.4.2008, 17:19
Не-а. Не работает. Объясните, откуда #32770 и "Internet Explorer_TridentDlgFrame"??

Нашёл и понял сам. Смог с помощью программки определить класс окна. Смог найти это окно. Но не смог найти кнопку &Нет на ней...
Код

WndWind = FindWindow("#32770", "Ошибка")
MsgBox Str(WndWind)' Показывает число
WbdButton = FindWindowEx(WndWind, WndWind, "&Нет", vbNullString)
MsgBox Str(WbdButton)'Показывает 0
Call SendMessage(WbdButton, BM_CLICK, 0, 0)


Нашёл! Ура! Вместо
Код

WbdButton = FindWindowEx(WndWind, WndWind, "&Нет", vbNullString)

надо было писать
Код

WbdButton = FindWindowEx(WndWind, 0, "Button", "&Нет")

Автор: ProgramerForever 10.4.2008, 10:30
Вопрос решён. Спасибо всем за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)