Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
Vinemax
131 / 98 / 4
Регистрация: 12.09.2011
Сообщений: 586
#1

Горячие клавиши для свернутой в трей программы - Visual Basic .NET

24.03.2012, 00:02. Просмотров 4350. Ответов 7
Метки нет (Все метки)

Привет всем!

Подскажите, пожалуйста, какую-нибудь нормальную реализацию вызова моей программы, висящей в трее или на панели задач, по нажатию какой-то комбинации горячих клавиш?

Нашел такой пример:

vb.net
1
2
3
4
5
6
7
8
9
10
11
    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
 
    Private Sub KeyTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KeyTimer.Tick
        Dim CtrlKey As Boolean = GetAsyncKeyState(Keys.ControlKey)
        Dim ShiftKey As Boolean = GetAsyncKeyState(Keys.ShiftKey)
        Dim Key As Boolean = GetAsyncKeyState(Keys.H)
 
        If CtrlKey And ShiftKey And Key Then
              ' отобразить окно моей программы
        End If
    End Sub
...т.е. здесь по нажатию Ctrl+Shift+H вызывается моя программа. В Windows XP всё прекрасно работает, а в Windows 7 x64 сразу при нажатии Ctrl+Shift без H происходит отображение моего окна.

Посоветуйте, пожалуйста, есть ли в .NET какая-то более надежная реализация опроса горячих клавиш?

Спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2012, 00:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Горячие клавиши для свернутой в трей программы (Visual Basic .NET):

Задать глобально горячие клавиши только для своего приложения
Private Sub Avtorizacia_KeyDown(ByVal sender As Object, ByVal e As...

Как сделать горячие клавиши в StripMenu
Как сделать горячие клавиши в StripMenu?

Горячие клавиши - Alt + кнопка мыши. Исправить код
Доброго времени! Есть код для горячих клавиш с использованием библиотеки...

После действий с формой (показать, скрыть, свернуть и т.п.) перестают работать горячие клавиши
Здравствуйте, уважаемые форумчане! Столкнулся с такой проблемой: после...

Как отправить иконку программы в трей?
Привет всем! У меня вопрос, как отправить иконку программы в трей в VB.NET...

Сворачивание программы в трей по нажатию на иконку её разворачивания
Здравствуйте. Не подскажите код, для сворачивания программы в трей и по нажатии...

7
eJ_Studio
167 / 147 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.03.2012, 04:26 #2
Лучший ответ Сообщение было отмечено как решение

Решение

самая нормальная это предназначенная для этого функция апи

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Public Enum HotKeyModifiers As Integer
    MOD_ALT = &H1
    MOD_CONTROL = &H2
    MOD_SHIFT = &H4
    MOD_WIN = &H8
    End Enum
    Private Const WM_HOTKEY As Integer = &H312
    Public Declare Auto Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
    Public Declare Auto Function UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
     
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    RegisterHotKey(Me.Handle, 1020, HotKeyModifiers.MOD_CONTROL, Keys.Up)
    End Sub
     
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    UnregisterHotKey(Me.Handle, 1020)
    End Sub
     
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    MyBase.WndProc(m)
    If (m.Msg = WM_HOTKEY) Then
    Dim hotKeyId As Integer = m.WParam.ToInt32()
    If hotKeyId = 1020 Then
    MsgBox("Hot Key Pressed")
    End If
    End If
    End Sub
Добавлено через 1 минуту
а конкретно
vb.net
1
2
3
4
5
6
7
8
9
10
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    MyBase.WndProc(m)
    If (m.Msg = WM_HOTKEY) Then
    Dim hotKeyId As Integer = m.WParam.ToInt32()
    If hotKeyId = 1020 Then
  Me.Show()
'or Me.WindowState = Windowstate.Normal
    End If
    End If
    End Sub
4
Vinemax
131 / 98 / 4
Регистрация: 12.09.2011
Сообщений: 586
24.03.2012, 04:36  [ТС] #3
eJ_Studio, спасибо! Я только не совсем понял в твоем коде, где указать какие клавиши опрашивать? Этот код:

vb.net
1
RegisterHotKey(Me.Handle, 1020, HotKeyModifiers.MOD_CONTROL, Keys.Up)
Как я понял, Keys.Up это опрашиваемая клавиша. Не мог бы ты подробнее рассказать, что такое 1020 , это константа - id, которая как бы инициализирует в данном случае Key.Up, своего рода номер? И еще... Допустим, мне нужно опросить Ctrl+F1... Нужно тогда в аргументе написать Keys.Up Or Keys.F1, так?
0
eJ_Studio
167 / 147 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.03.2012, 05:08 #4
Цитата Сообщение от Vinemax Посмотреть сообщение
Допустим, мне нужно опросить Ctrl+F1...
vb.net
1
RegisterHotKey(Me.Handle, 1020, HotKeyModifiers.MOD_CONTROL, Keys.F4)
я просто не очень удачный пример самих зарегистрированных данным кодом клавиш продемонстрировал, в 3 параметре ты указываешь управляющую клавишу(альт, контрол, вин, шифт), а в 4-ом параметре - ту клавишу с которой будет работать сочетание - управляющая кнопка + обычная кнопка(блин, незнаю как грамотней описать).
Кароче ты можешь сделать и так: (например тебе надо чтобы по нажатию контрол+шифт+ф4 вызывалась форма)
vb.net
1
RegisterHotKey(Me.Handle, 1020, HotKeyModifiers.MOD_CONTROL Or HotKeyModifiers.MOD_SHIFT, Keys.F4)
1020 - это как бы индефикатор твоих зарегистрированных горячих клавиш(в твоем случае контрол+ф4)
Индефикатор может быть любой цифрой, главное чтобы сам не запутался.

Если зарегистрируешь допустим клавиши Альт+таб - то стандартный перебор окон в винде не будет срабатывать, то есть получается мы подменяем действие Альт+Таб, то есть наши горячие клавиши приоритетней чем у виндоса, а вот с Ктрл+Альт+Дель сие действие не прошло, видимо эти клавиши уже не переплюнуть, по крайней мере на этом уровне.
Учти что если ты допустим зарегистрируешь какую либо клавишу(допустим обычную букву А) - (без управляющего символа) - то пока ты не дерегистрируешь эту горячую клавишу - она не будет срабатывать в системе, кароче не сможешь ее писать, вот тока не помню, до тех пор пока не дерегистрируешь или пока не закроешь программу(но "дерегистрировать" все равно нужно)
vb.net
1
RegisterHotKey(Me.Handle, 300, Nothing, А)
Причем регистрировать горячие клавиши можно и несколько
vb.net
1
2
3
RegisterHotKey(Me.Handle, 259, HotKeyModifiers.MOD_WIN, KEys.S)
RegisterHotKey(Me.Handle, 259, HotKeyModifiers.MOD_ALT, Keys.V)
RegisterHotKey(Me.Handle, 259, HotKeyModifiers.MOD_CONTROL, Nothing)
2
Vinemax
131 / 98 / 4
Регистрация: 12.09.2011
Сообщений: 586
24.03.2012, 05:18  [ТС] #5
А понял! HotKeyModifiers.MOD_CONTROL - не обратил сразу внимание. Благодарю! И последний подвопросник... Если мне нужно дерегистрировать горячие клавиши, т.е. отключить их для моей программы, не выходя из самой программы, то в любом месте кода, где мне нужно (допустим, по нажатию на Button), я ставлю UnregisterHotKey(Me.Handle, 1020), правильно?
0
eJ_Studio
167 / 147 / 14
Регистрация: 13.07.2011
Сообщений: 477
24.03.2012, 05:43 #6
сори, чуть не правильно привел пример - а то сработает только послядняя клавиша(горячая)

vb.net
1
2
3
RegisterHotKey(Me.Handle, 259, HotKeyModifiers.MOD_WIN, KEys.S)
RegisterHotKey(Me.Handle, 260, HotKeyModifiers.MOD_ALT, Keys.V)
RegisterHotKey(Me.Handle, 261, HotKeyModifiers.MOD_CONTROL, Nothing)
и в опрошалке ставишь условие
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
If (m.Msg = WM_HOTKEY) Then
Dim hotKeyId As Integer = m.WParam.ToInt32()
If hotKeyId = 259 Then
MsgBox("Win+S")
ElseIF   hotKeyId = 260 Then
MsgBox("Alt+V")
elseif  hotKeyId = 261 Then
MsgBox("Control")
End IF
End If
End Sub

Да, снимать регистрацию нужно именно так
vb.net
1
UnregisterHotKey(Me.Handle, 1020)
Только индефикатор должен быть тот который ты указал, в данном случае
vb.net
1
2
3
RegisterHotKey(Me.Handle, 259)
UnregisterHotKey(Me.Handle, 260)
UnregisterHotKey(Me.Handle, 261)
Как видишь ничего сложного(по крайней мере когда разберешься)

Добавлено через 18 минут
да емае
vb.net
1
UnregisterHotKey(Me.Handle, 259)
1
Vinemax
131 / 98 / 4
Регистрация: 12.09.2011
Сообщений: 586
24.03.2012, 08:54  [ТС] #7
eJ_Studio, большое спасибо! Тему понял. Буду вписывать в свою программу.
0
IgorX95
0 / 0 / 2
Регистрация: 14.10.2013
Сообщений: 101
11.10.2017, 07:01 #8
Здравствуйте. Можно глобально отловить нажатие клавиш отдельно левых и правых Ctrl, Alt, Shift?
0
11.10.2017, 07:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2017, 07:01
Привет! Вот еще темы с решениями:

Сворачивание окна программы в панель задач и трей
Здравствуйте. Помогите советом) Недавно начал изучать VB 2010) Так вот......

Автозапуск программы при загрузке ОС и ее сворачивание в трей
В общем написал программу, которая запускается при загрузке ОС. 8-) Всё в...

Реакция программы на нажатие клавиш, даже если она свернута в трей
Здравствуйте. При нажатии на клавишу D значение переменной klav увеличивается...

Сделать программу для css (Bennyhop), чтобы при запуске она сворачивалась в трей
как сделать программу для css (Bennyhop) и что бы при запуске она еще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru