Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
eJ_Studio
168 / 148 / 14
Регистрация: 13.07.2011
Сообщений: 477
1

Две пары горячих клавиш в неактивном приложении

17.08.2011, 18:33. Просмотров 1198. Ответов 9
Метки нет (Все метки)

в Этой теме обсуждалось как сделать горячие клавиши для приложения.
Получилось в итоге, но получилось лишь с одной парой.

А вот как сделать чтобы приожение не имело фокус и можно было бы одной парой(допустим альт+д) вызвать месадж и вин+б другой месаджбокс.
Как это сделать??
Наименование гор клавиш неважно
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2011, 18:33
Ответы с готовыми решениями:

Отлов горячих клавиш
Нужно что-бы при нажатии на Enter функция возвращала true Пробовал Private Declare Function...

Запрет горячих клавиш windows в программе
Как можно сделать, чтобы после запуска программы до ее закрытия, горячие клавиши переставали...

Одновременная обработка нескольких горячих клавиш
Доброго времени суток. Горячие клавиши для свернутой в трей программы Такой вопрос - нельзя ли...

Реализация горячих клавиш в самописном WebBrowser
Здравствуйте. У меня имеется проект,браузер для одного сайта,вернее для работы на сайте,на этот...

9
Памирыч
Почетный модератор
21163 / 8892 / 1080
Регистрация: 11.04.2010
Сообщений: 11,012
17.08.2011, 19:53 2
Цитата Сообщение от eJ_Studio Посмотреть сообщение
в Этой теме
в какой?
0
Devel
90 / 45 / 2
Регистрация: 02.11.2010
Сообщений: 261
17.08.2011, 21:08 3
Цитата Сообщение от Памирыч Посмотреть сообщение
в какой?

Не по теме:

Я думаю он ошибся. В этом форуме. Или на этой конференции :D

0
Ciberst
521 / 432 / 21
Регистрация: 16.12.2010
Сообщений: 953
Завершенные тесты: 1
17.08.2011, 21:48 4
eJ_Studio, https://www.cyberforum.ru/post1862985.html, если ты про мой пост?

Добавлено через 14 минут
то там, создаешь вторую форму и проделываешь все те же действия
0
eJ_Studio
168 / 148 / 14
Регистрация: 13.07.2011
Сообщений: 477
18.08.2011, 17:37  [ТС] 5
Памирыч, Приложение не видно в трее и панели задач, главная форма вызывается горячими клавишами

Ciberst, можешь расжувать? или пример привести, если не сложно
0
Ciberst
521 / 432 / 21
Регистрация: 16.12.2010
Сообщений: 953
Завершенные тесты: 1
18.08.2011, 18:04 6
Как-то так
Class
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Imports System.Runtime.InteropServices
Public Class WindowsShell
#Region "fields"
    Public Shared MOD_ALT As Integer = &H1
    Public Shared MOD_CONTROL As Integer = &H2
    Public Shared MOD_SHIFT As Integer = &H4
    Public Shared MOD_WIN As Integer = &H8
    Public Shared WM_HOTKEY As Integer = &H312
#End Region
 
    <DllImport("user32.dll")> _
    Private Shared Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vlc As Integer) As Boolean
    End Function
 
    <DllImport("user32.dll")> _
    Private Shared Function UnregisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
    End Function
 
    Private Shared keyId As Integer
    Public Shared Sub RegisterHotKey(ByVal f As Form, ByVal key As Keys)
        Dim modifiers As Integer = 0
 
        If (key And Keys.Alt) = Keys.Alt Then
            modifiers = modifiers Or WindowsShell.MOD_ALT
        End If
 
        If (key And Keys.Control) = Keys.Control Then
            modifiers = modifiers Or WindowsShell.MOD_CONTROL
        End If
 
        If (key And Keys.Shift) = Keys.Shift Then
            modifiers = modifiers Or WindowsShell.MOD_SHIFT
        End If
 
        Dim k As Keys = key And Not Keys.Control And Not Keys.Shift And Not Keys.Alt
        keyId = f.GetHashCode()
        ' this should be a key unique ID, modify this if you want more than one hotkey
        RegisterHotKey(DirectCast(f.Handle, IntPtr), keyId, CUInt(modifiers), CUInt(k))
    End Sub
 
    Private Delegate Sub Func()
 
    Public Shared Sub UnregisterHotKey(ByVal f As Form)
        Try
            ' modify this if you want more than one hotkey
            UnregisterHotKey(f.Handle, keyId)
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub
End Class
Form1
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
28
29
Public Class Form1
    Implements IDisposable
    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Dim k As Keys = Keys.A Or Keys.Control
        'регистрируем горячую клавишу
        WindowsShell.RegisterHotKey(Me, k)
    End Sub
 
    ' CF Note: The WndProc is not present in the Compact Framework (as of vers. 3.5)! please derive from the MessageWindow class in order to handle WM_HOTKEY
    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        'здесь мы получаем событие принажатии горячей клавиши
        If m.Msg = WindowsShell.WM_HOTKEY Then
 
            Me.WindowState = FormWindowState.Normal
            Me.Activate()
        End If
    End Sub
 
    Private Sub FrmClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
        'не забываем снять регистрацию)
        WindowsShell.UnregisterHotKey(Me)
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Form2.Show()
    End Sub
End Class
Form2
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
Public Class Form2
    Implements IDisposable
    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Dim k As Keys = Keys.D Or Keys.Control
        'регистрируем горячую клавишу
        WindowsShell.RegisterHotKey(Me, k)
    End Sub
 
    ' CF Note: The WndProc is not present in the Compact Framework (as of vers. 3.5)! please derive from the MessageWindow class in order to handle WM_HOTKEY
    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        'здесь мы получаем событие принажатии горячей клавиши
        If m.Msg = WindowsShell.WM_HOTKEY Then
 
            Me.WindowState = FormWindowState.Normal
            Me.Activate()
        End If
    End Sub
 
    Private Sub FrmClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
        'не забываем снять регистрацию)
        WindowsShell.UnregisterHotKey(Me)
    End Sub
End Class
0
Ivan76
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 129
19.08.2011, 10:22 7
Предлагаю использовать DirectInput, в таком случае можно принимать сигналы с клавиатуры даже если окно находится в неактивном режиме.
0
NickoTin
Почетный модератор
Эксперт .NET
8660 / 3612 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.08.2011, 12:40 8
Перед использованием WinApi стоит почитать документацию, там всё написано. Касательно RegisterHotKey там написано что вместе с сообщением WM_HOTKEY первым параметром (WPARAM) посылается Id сообщения, благодаря этому можно задавать несколько горячих клавиш окну, меняя только Id горячих клавиш.

Отловить нажатие сочетания клавиш глобально
1
Ciberst
521 / 432 / 21
Регистрация: 16.12.2010
Сообщений: 953
Завершенные тесты: 1
19.08.2011, 13:05 9
Переделал код, который выше, от меня
Class
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Imports System.Runtime.InteropServices
Public Class WindowsShell
#Region "fields"
    Public Shared MOD_ALT As Integer = &H1
    Public Shared MOD_CONTROL As Integer = &H2
    Public Shared MOD_SHIFT As Integer = &H4
    Public Shared MOD_WIN As Integer = &H8
    Public Shared WM_HOTKEY As Integer = &H312
#End Region
 
    <DllImport("user32.dll")> _
    Private Shared Function RegisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vlc As Integer) As Boolean
    End Function
 
    <DllImport("user32.dll")> _
    Private Shared Function UnregisterHotKey(ByVal hWnd As IntPtr, ByVal id As Integer) As Boolean
    End Function
 
    'Private Shared keyId As Integer
    Public Shared Sub RegisterHotKey(ByVal f As Form, ByVal key As Keys, ByVal keyId As Integer)
        Dim modifiers As Integer = 0
 
        If (key And Keys.Alt) = Keys.Alt Then
            modifiers = modifiers Or WindowsShell.MOD_ALT
        End If
 
        If (key And Keys.Control) = Keys.Control Then
            modifiers = modifiers Or WindowsShell.MOD_CONTROL
        End If
 
        If (key And Keys.Shift) = Keys.Shift Then
            modifiers = modifiers Or WindowsShell.MOD_SHIFT
        End If
 
        Dim k As Keys = key And Not Keys.Control And Not Keys.Shift And Not Keys.Alt
        'keyId = f.GetHashCode()
        ' this should be a key unique ID, modify this if you want more than one hotkey
        RegisterHotKey(DirectCast(f.Handle, IntPtr), keyId, CUInt(modifiers), CUInt(k))
    End Sub
 
    Private Delegate Sub Func()
 
    Public Shared Sub UnregisterHotKey(ByVal f As Form, ByVal keyId As Integer)
        Try
            ' modify this if you want more than one hotkey
            UnregisterHotKey(f.Handle, keyId)
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub
End Class
Form1
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
28
29
30
31
32
33
34
35
36
37
38
Public Class Form1
 
    Implements IDisposable
    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Dim k As Keys = Keys.A Or Keys.Control
        Dim k1 As Keys = Keys.D Or Keys.Control
        'регистрируем горячую клавишу
        WindowsShell.RegisterHotKey(Me, k, 0)
        WindowsShell.RegisterHotKey(Me, k1, 1)
    End Sub
 
    ' CF Note: The WndProc is not present in the Compact Framework (as of vers. 3.5)! please derive from the MessageWindow class in order to handle WM_HOTKEY
    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)
        'здесь мы получаем событие принажатии горячей клавиши
        If m.Msg = WindowsShell.WM_HOTKEY Then
            Select Case m.WParam
                Case 0
                    Me.WindowState = FormWindowState.Normal
                    Me.Activate()
                    MsgBox("K")
                Case 1
                    Me.WindowState = FormWindowState.Normal
                    Me.Activate()
                    MsgBox("K1")
            End Select
    
        End If
    End Sub
 
    Private Sub FrmClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
        'не забываем снять регистрацию)
        WindowsShell.UnregisterHotKey(Me, 0)
        WindowsShell.UnregisterHotKey(Me, 1)
    End Sub
 
End Class
0
eJ_Studio
168 / 148 / 14
Регистрация: 13.07.2011
Сообщений: 477
20.08.2011, 06:42  [ТС] 10
бошой спс, почитаю

Добавлено через 14 часов 0 минут
Ciberst, крутяка..Спасиб что позамудрился с кодом..я вообще не то перебирал.
Только вот не поймупочему с Лвином не работает...Причем если первоначальный код юзать то там нуно добавить
vb.net
1
2
3
4
5
If (key And Keys.LWin) = Keys.LWin Then
'            modifiers = modifiers Or WindowsShell.MOD_WIN
'        End If
 
'        Dim k As Keys = key And Not Keys.Control And Not Keys.Shift And Not Keys.Alt [B]And Not Keys.LWin[/B]
Но на правый вин не срабатывал код.
Причем появление формы всегда разное какоето ..если добавить в строчку And Not Keys.LWin то появление плавное(снизу вверх), а если недобавлять то форма просто вдруг появляется(или все наоборот, но точно с этими глюками)

А теперь и вовсе не работает не какой Вин. Вот бы его тоже заюзать как нужно.
Ciberst,
Может доюзаешь до конца - раз ты в этой теме понимаешь хорошо6)

Добавлено через 1 минуту
вот сейчас с твоим кодом окно просто вдруг появляется на поверхности, без какого либо разворачивания с панели на стол

Добавлено через 2 минуты
и зачем в коде делегат фанк? если его не используем

Добавлено через 1 час 39 минут
и вот еще..

если заюзать так
vb.net
1
2
3
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim k As Keys = Keys.Alt Or Keys.Tab
        Dim k1 As Keys = Keys.Control Or Keys.Alt
то нажимаю альт-таб форма появляется не дождавшись отпускания клавиши.
А другое сочетание контрол+альт - срабатывает только после отпускания и не раньше, почемутак не пойму
0
20.08.2011, 06:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2011, 06:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нажатие клавиш в стороннем приложении
всем привет вообщем ребят с програмированием начал заниматся всего неделю :) написал пару простых...

Использование горячих клавиш при неактивном окне
как реализовать привязку события (т.е. по нажатию кнопки на клавиатуре происходит определенное...

Прослушивать нажатия клавиш при неактивном приложении
Здравствуйте! Хочется сделать программу, которая выполняет некоторые действия когда нажимается...

Использование горячих клавиш в свёрнутом приложении
В общем задача такая. Запустил программу, и свернул. Дальше нужно чтобы по нажатию горячих...


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

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

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