Код установления глобальной горячей клавиши

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

Код установления глобальной горячей клавиши

Сообщение Asu2008 » 22.01.2008 (Вт) 18:47

Вот код
Код: Выделить всё
' Module
' - - - - - -
' Код модуля

Option Explicit

Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const MOD_WIN = &H8

Private Const WM_HOTKEY = &H312
Public Const GWL_WNDPROC = -4

Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Long
Public Declare Function GlobalDeleteAtom Lib "kernel32" (ByVal nAtom As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public hForm As Long
Public OldWndProc As Long

Public hAtom1 As Long
Public hAtom2 As Long
Public dl As Long

Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  Select Case Msg
  Case WM_HOTKEY
    If wParam = hAtom1 Then Beep       'Alt+Q
    If wParam = hAtom2 Then Form1.Show 'Alt+Win+Z
  End Select

  WindowProc = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
End Function

' - - - - - - - - - - - -
' Form
' - - - - - -
' Код формы

Option Explicit

Private Sub Form_Load()
  hForm = Form1.hwnd

' Субклассируем Форму (Form1) (Смотрите дополнительно:
' http://pva-land.jino-net.ru/codesvb/037.php
  OldWndProc = SetWindowLong(hForm, GWL_WNDPROC, AddressOf WindowProc)

' 1)
' При нажатии комбинации клавиш Alt и Q компьютер
' говорит "Beep"
' 2)
' При нажатии комбинации клавиш Alt, Win (Виндовз) и Z
' на экране появляется Форма (Form1)

' Создаем глобальный атом
  hAtom1 = GlobalAddAtom("A:myglobatom1")

' Устанавливаем горячую клавишу (Alt+Q)
  dl = RegisterHotKey(hForm, hAtom1, MOD_ALT, vbKeyQ)

  hAtom2 = GlobalAddAtom("A:myglobatom2")
  dl = RegisterHotKey(hForm, hAtom2, MOD_ALT Or MOD_WIN, vbKeyZ)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  dl = SetWindowLong(hForm, GWL_WNDPROC, OldWndProc)

  dl = UnregisterHotKey(hForm, hAtom1)
  dl = GlobalDeleteAtom(hAtom1)
  dl = UnregisterHotKey(hForm, hAtom2)
  dl = GlobalDeleteAtom(hAtom2)
End Sub

как можно переделать чтобы можно было использовать клавиши пр. Z+1, Z+X,F+7

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.01.2008 (Вт) 19:36

По видимому никак, хотя можно попробовать использовать накопление, т.е. отследить сначала нажатие одной клавиши, затем второй и так далее при необходимости. Однако, без нажатия клавиш модификаторов не обойтись. Есть и другие подводные камни
Весь мир матрица, а мы в нем потоки байтов!

Asu2008
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.01.2008 (Вс) 6:10

Сообщение Asu2008 » 22.01.2008 (Вт) 19:48

Viper писал(а): Есть и другие подводные камни

Какие?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Код установления глобальной горячей клавиши

Сообщение jangle » 22.01.2008 (Вт) 21:51

Asu2008 писал(а):Вот код
[code]' Module
' - - - - - -

как можно переделать чтобы можно было использовать клавиши пр. Z+1, Z+X,F+7


Никак, прийдется выбирать только из MOD_ALT, MOD_CONTROL, MOD_SHIFT. Т.к. флаг fsModifiers, из RegisterHotKey других параметров не допускает


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 118

    TopList