Страница: 1 |
Страница: 1 |
Вопрос: Виртуальная клавиатура - помогите!!!
Добавлено: 28.09.06 17:53
Автор вопроса: Ирина
Помогите кодом VB6 для создания виртуальной экранной клавиатуры. Пробовала через функцию keybd_event, возможно имитация клавиши происходит, но нужная программа (например, блокнот) теряет активность и ввод символа не происходит. Замучилась((( Определить hWnd? Но окно блокнота уже не активно!
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #1
Добавлено: 28.09.06 17:59
А через GetWindowPos не пробовала?
Номер ответа: 2
Автор ответа:
Ирина
Вопросов: 2
Ответов: 15
Профиль | | #2
Добавлено: 28.09.06 18:05
Щас попробую, если это реально.
Номер ответа: 3
Автор ответа:
Ирина
Вопросов: 2
Ответов: 15
Профиль | | #3
Добавлено: 28.09.06 18:07
Только зачем определять позицию окна???
Номер ответа: 4
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #4
Добавлено: 28.09.06 22:49
Это не только определять позицию окна, а выводит его напередний план, например:
0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
Номер ответа: 5
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #5
Добавлено: 28.09.06 22:51
Выводишь его наперед каждый раз перед нажатием клавиши, ну как?
Номер ответа: 6
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #6
Добавлено: 29.09.06 06:00
Каждый раз перед отправкой символа
находим блокнот :
hWnotepad=FindWindow("Notepad",""' искать по классу
находим хандл места где печатают (Edit control ID у всех нотепадов =15) :
hEditNotepad=GetDlgItem(hWnotepad,15)
Приготовленый символ ложим в клипбоард
и посылаем его в нотепад:
SendMessage(hEditNotepad,WM_PASTE,0,0)
В этом случае все вставиться даже если блокнот будет свернутый в трэй
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 29.09.06 11:10
А нах через клипборд? Засадный вариант.
Номер ответа: 8
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #8
Добавлено: 29.09.06 11:22
Для данной задачи походу подойдет:
Private Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Sub Command1_MouseDown(...)
SetActiveWindow 0
keybd_event 84, 0, 0, 0 't
keybd_event 84, 0, KEYEVENTF_KEYUP, 0 'release t
End Sub
Символы пойдут предыдущему активному приложению.
Номер ответа: 9
Автор ответа:
Ирина
Вопросов: 2
Ответов: 15
Профиль | | #9
Добавлено: 29.09.06 17:10
Спасибо большое, Sur! Все работает!
Private Declare Function SetActiveWindow Lib "user32" (ByVal hwnd 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 KEYEVENTF_KEYUP = &H2
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
SetActiveWindow 0
keybd_event 84, 0, 0, 0 't
keybd_event 84, 0, KEYEVENTF_KEYUP, 0 'release t
End Sub
Номер ответа: 10
Автор ответа:
Ирина
Вопросов: 2
Ответов: 15
Профиль | | #10
Добавлено: 29.09.06 17:48
Оказывается, работает, но не совсем так.
1.Символ выводится не всегда, иногда фокус не передается предыдущему активному приложению.
3.Мешает мерцание формы при клике.
2.Такая задача, как переименование иконки, вообще, становиться невыполнимой.
Номер ответа: 11
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #11
Добавлено: 29.09.06 20:45
Та тут в корне все не так...
Клацая по кнопке на экранной клаве, теоретически, окно этой клавы должно стать активным... оно так и становится, это объясняет мигание... keybd_event после этого давит кнопке не в окне блокноота(например), а в своем, собственном...
Дело такое решится сабкласингом, на форуме как раз обсуждается, про WM_ACTIVATE... Надо воопщем окну запретить становится активным...
Потом хук на мышь, WindowFromPoint получишь hwnd кнопки на виртуальной клаве, и вот только тогда уже keybd_event...
Номер ответа: 12
Автор ответа:
Ирина
Вопросов: 2
Ответов: 15
Профиль | | #12
Добавлено: 01.10.06 23:12
Выход найден, остальное - дело техники. Спасибо добрым людям!
Теперь окно не мерцает и, хотя, на вид остается активным, при кликах не перехватывает активность другой программы. Кстати, первым делом было переименовано название иконки.
Option Explicit
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Const WS_EX_NOACTIVATE As Long = &H8000000
Private Const GWL_EXSTYLE As Long = (-20)
Private Const SW_SHOWNOACTIVATE As Long = 4
'Нажатие клавиш
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 KEYEVENTF_KEYUP = &H2 ' – это используется для того чтобы отпустить клавишу
Private Sub Command1_Click()
keybd_event 84, 0, 0, 0 'нажата t
keybd_event 84, 0, KEYEVENTF_KEYUP, 0 'release t
End Sub
Private Sub Form_Load()
Me.Visible = False
ShowWindow Me.hwnd, SW_SHOWNOACTIVATE
SetWindowLong Me.hwnd, GWL_EXSTYLE, GetWindowLong(Me.hwnd, GWL_EXSTYLE) + WS_EX_NOACTIVATE
End Sub