Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Виртуальная клавиатура - помогите!!! Добавлено: 28.09.06 17:53  

Автор вопроса:  Ирина
Помогите кодом VB6 для создания виртуальной экранной клавиатуры. Пробовала через функцию keybd_event, возможно имитация клавиши происходит, но нужная программа (например, блокнот) теряет активность и ввод символа не происходит. Замучилась((( Определить hWnd? Но окно блокнота уже не активно!

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #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-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 28.09.06 22:49
Это не только определять позицию окна, а выводит его напередний план, например:
   t = SetWindowPos(Me.hwnd, HWND_TOPMOST, _
   0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)

Ответить

Номер ответа: 5
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #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-сайт: sur.hotbox.ru/
 Профиль | | #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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам