Ввод текста в неактивное окно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Ввод текста в неактивное окно

Сообщение nekeda » 29.12.2007 (Сб) 22:02

Подскажите, возможно ли эмулировать нажатие клавиш для неактивного окна (зная его hwnd) ?
Необходимо вводить в это окно текст, при том что оно не является стандартным текстовым полем. Если окно активно, SendKeys работает, и текст вводится. А как быть если окно не активно? Я имею ввиду, оно должно быть неактивным, вариант "сделай его активным" не подходит. :)

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 29.12.2007 (Сб) 22:08

А что конкретно за окно? SetWindowText не работает?
Salus populi suprema lex

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.12.2007 (Сб) 22:14

dr.MIG
флешка :\ в ней есть поле для ввода, оно активно.. но hwnd у поля конечно нет.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 29.12.2007 (Сб) 22:32

Гм... Не понял... В первом посте написано, что надо вводить текст в неактивное окно, зная его хэндл, а во втором, что в активное без хэндла... Если совместить два поста, то получится, что надо вводить в неактивное окно без хэндла...
Salus populi suprema lex

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 29.12.2007 (Сб) 23:33

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.12.2007 (Сб) 23:59

Посылай нажатия главному окну, предварительно поместив псведо-фокус на псевдо-текст-бокс.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 0:39

Хакер
что есть псевдо фокус?
Задача состоит в том, чтобы посылать текст этому окну по hwnd, в то время как это окно неактивно, а активно любое другое.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 1:24

Псевдо-форкус это мнимый форкус текстбокса. Когда ты кликнешь мышкой по этому текст-боксу, в нём начнёт мигать каретка. Если ты кликнешь по другому - картетка будет мигать в нём. Но это псевдо-форкус, потому что он не имеет ничего общего с настоящим форкусом, который устанавливается API-функцией SetFocus.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 2:46

Кликнуть мышкой = сделать окно активным.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 2:55

Нет.
Код: Выделить всё
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
     ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByRef lParam As Any) As Long
     Private Const WM_MOUSEACTIVATE As Long = &H21
Private Const WM_LBUTTONUP As Long = &H202
Private Const WM_LBUTTONDOWN As Long = &H201

Public Sub Main()
    Dim a As New Form1
    Dim b As New Form1
    a.Show
    a.Caption = "я - a"
    b.Show
    b.Caption = "я - b"
    MsgBox "e"
   
   
    a.ZOrder 0
    b.ZOrder 0
    SendMessage a.hwnd, WM_LBUTTONDOWN, 0, &H200020
    DoEvents
    SendMessage a.hwnd, WM_LBUTTONUP, 0, &H200020
    DoEvents
End Sub
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 3:48

Понял.
Ты предлагаешь сделать такой псевдо-клик по окну? Но если в твоём примере поместить на форму текстбокс, а в код добавить Sendkeys то текст появится на форме b, хотя псевдо-клик был сделан по форме а.
Если же сделать клик не по форме, а по текстбоксу (a.text1.hwnd) - то текст в нём появится, но во-перых, после этого форма а становится активной, а во-вторых у флешевского текстбокса нет hwnd..

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 3:49

TextBox это настоящее окно, а не его эмуляция как во флеше.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 14:46

Тем не менее, и в твоём примере, и в интересующем меня проекте после такого псевдо-клика текст SendKeys посылается активному окну, а не тому, о котором речь.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 15:41

В моём примере и в моих постах не было ни единого упоминания SendKeys.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 16:05

keyb_event даёт тот же результат. Как ещё можно "Посылать нажатия главному окну"?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.12.2007 (Вс) 16:20

Эмм... Ну зачем же keybd_event ? Туда сваливается управление от драйвера клавиатуры в контексте каждого процесса.

Send(Post)Message.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 30.12.2007 (Вс) 16:49

Хакер
Спасибо за помощь, разобрался)

Вдруг кому то ещё пригодится - WM_KEYDOWN/WM_KEYUP для спец. клавиш, и WM_CHAR для ввода символов.

З.Ы. и кстати, псведо-клик не нужен :)

З.Ы.Ы. вру, нужен.

hyoufuu
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 11.02.2008 (Пн) 17:33

Сообщение hyoufuu » 11.02.2008 (Пн) 17:49

Поведайте, плиз, в окончательном варианте sendmessage c WM_KEYDOWN/WM_KEYUP/WM_CHAR, где и как его надо вставлять.
Задача у меня почти та же, что и у nakeda: есть hwnd окна, в которое надо послать эмуляцию нажатия клавиши, но при этом окно должно оставаться неактивным.

Сегодня весь день страдал, пытаясь разобраться с SendMessage.
Вот так оно не хочет работать
Код: Выделить всё
Public Sub Main()
    Dim handle As Long
    Dim a As New Form1
    Dim b As New Form1
    a.Show
    a.Caption = "ÿ - a"
    b.Show
    b.Caption = "ÿ - b"
    MsgBox "e"
   
    handle = a.hwnd
        a.ZOrder 0
        b.ZOrder 0
        SendMessage handle, WM_LBUTTONDOWN, 0, &H200020
        DoEvents
        SendMessage handle, WM_LBUTTONUP, 0, &H200020
        DoEvents
        SendMessage handle, WM_KEYDOWN, VK_1, 0
        DoEvents
        SendMessage handle, WM_KEYUP, VK_1, 0
        DoEvents
End Sub


где моя ошибка?

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 11.02.2008 (Пн) 19:14

Еденичку хочешь напечатать? для символов используется WM_CHAR:

Код: Выделить всё
SendMessage wnd, WM_CHAR, Asc("1"), 0

hyoufuu
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 11.02.2008 (Пн) 17:33

Сообщение hyoufuu » 12.02.2008 (Вт) 14:49

Спасибо, разобрался.
Единица в текстовом поле не печатается (то почему я так долго пытался разобраться), но это и не нужно.
Догадался сделать в форме события Form_KeyDown / _keypres и отловил, что "1" действительно посылается и даже в нужную форму :)

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 20.04.2008 (Вс) 16:48

пОМОГИТЕ делаю вот это

Код: Выделить всё
SendMessage WindowFromPoint(Curs.X, Curs.Y), WM_LBUTTONDOWN, 0, &H200020
DoEvents
SendMessage WindowFromPoint(Curs.X, Curs.Y), WM_LBUTTONUP, 0, &H200020
DoEvents


Все хорошо кнопки на форме у меня частично срабатывают на клик

но как реализовать реальный клик чтоб можно было нажать на рабочий стол и запустить приложение? или на крестик и закрыть форму

происходят какието странные вещи: например поле АДРЕС в ИЕ и проводнике раскрывается если навести на кнопку ВЫПАДЕНИЕ
Также и курсор туда ставится и писать там можно
НО например ссылки не жмуться в самом ИЕ и в окошко для написания сообщения курсор тоже не ставится :(

Подскажите в чем проблема плиз :cry:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList