Хук клавиатуры на своем приложении.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Sector
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 26.10.2004 (Вт) 14:43

Хук клавиатуры на своем приложении.

Сообщение Sector » 18.08.2008 (Пн) 13:49

Существует ли простой и изящный способ перехватывать нажатия кнопок клавиатуры в своем приложении, не отслеживая каждый контрол. Для чего надо: на цифровой клавиатуре вместо точки выводить запятую, в соответствующих региональных настройках.

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
....какой-то код
MyBase.WndProc(m)
End Sub

не работает конкретно с DataGridView, во время нажатия клавиш в ячейке контрола никаких сообщений не пробегает, сабклассинг контрола по onKeyDown тоже не получается.

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

Re: Хук клавиатуры на своем приложении.

Сообщение Viper » 18.08.2008 (Пн) 13:57

Sector писал(а):Для чего надо: на цифровой клавиатуре вместо точки выводить запятую, в соответствующих региональных настройках.
То есть типичный случай реализации X через Y.
Sector писал(а):не работает конкретно с DataGridView, во время нажатия клавиш в ячейке контрола никаких сообщений не пробегает, сабклассинг контрола по onKeyDown тоже не получается.
Не получается, что именно? Как реализовано?
Весь мир матрица, а мы в нем потоки байтов!

Sector
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 26.10.2004 (Вт) 14:43

Re: Хук клавиатуры на своем приложении.

Сообщение Sector » 18.08.2008 (Пн) 14:20

Вот именно никак не реализовано...

ну например, попробовал узнать, что там пробегает в контроле во время нажатия клавиш.


Код: Выделить всё
Public Class SomeForm
    WithEvents dg1 As New MyDataGridView
Private Sub SomeForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     


       me.Controls.Add(dg1)
       dg1.Columns.Add("test1", "test1")
        dg1.Rows.Add() '' трам пампам пару ячеек здесь добавим в контроле, что был не пустой

     
    End Sub
end class


Public Class MyDataGridView
    Inherits System.Windows.Forms.DataGridView

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Debug.Print(m.Msg)' где чего-нибудь на нажатие клавиш?
       
        MyBase.WndProc(m)
    End Sub

End Class

Viper писал(а):То есть типичный случай реализации X через Y.


Эта ирония? Вот, скажем, набирает человек цифровые данные, с русскими региональными настройками. Удобнее пальцами тыкать на цифровой клавиатуре, и в качестве разделителя запятая (и эх точка там на клаве ), ну что пальцем тянуться к запятой на основной клавиатуре? Или может поставить в настройках в качестве разделителя запятую? Эти два выхода никуда негодны. "Я - пользователь сделайте мне красиво, запятую как в других программах, в том же екселе например".

Ну и что остается делать мне бедному программисту?
1. Ловим клавишу и меняем на лету - очень заманчиво и никаких гемороев
2. Позволить пользователю вставлять "не разделитель" в качестве "разделителя" и потом парсить и подгонять к цифровым данным - можно, но геморройно и некрасиво для пользователя там и точка и запятая и черт с рогами
3. Еще какой-то простой способ, которого я не знаю из-за которого выгляжу дураком

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

Re: Хук клавиатуры на своем приложении.

Сообщение Viper » 18.08.2008 (Пн) 14:53

Интересно, а почему у меня работают события формы KeyUp, KeyPress и KeyDown при установленном в True свойстве формы KeyPreview?
З.Ы. Пользуйся тегом Code. Очень советую.
Весь мир матрица, а мы в нем потоки байтов!

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

Re: Хук клавиатуры на своем приложении.

Сообщение Viper » 18.08.2008 (Пн) 14:57

Sector писал(а):
Viper писал(а):То есть типичный случай реализации X через Y.


Эта ирония? Вот, скажем, набирает человек цифровые данные, с русскими региональными настройками. Удобнее пальцами тыкать на цифровой клавиатуре, и в качестве разделителя запятая (и эх точка там на клаве ), ну что пальцем тянуться к запятой на основной клавиатуре? Или может поставить в настройках в качестве разделителя запятую? Эти два выхода никуда негодны. "Я - пользователь сделайте мне красиво, запятую как в других программах, в том же екселе например".

Ну и что остается делать мне бедному программисту?
1. Ловим клавишу и меняем на лету - очень заманчиво и никаких гемороев
2. Позволить пользователю вставлять "не разделитель" в качестве "разделителя" и потом парсить и подгонять к цифровым данным - можно, но геморройно и некрасиво для пользователя там и точка и запятая и черт с рогами
3. Еще какой-то простой способ, которого я не знаю из-за которого выгляжу дураком
Бедному программисту остается воспользоваться способом номер 2.
Весь мир матрица, а мы в нем потоки байтов!

Sector
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 26.10.2004 (Вт) 14:43

Re: Хук клавиатуры на своем приложении.

Сообщение Sector » 18.08.2008 (Пн) 16:50

Спасибо, за наводку по KeyPreview, я этого не знал

без дополнительной переменной bDecimal не выходит
реализовано на скорую руку так:

Код: Выделить всё

dim bDecimal as boolean
Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
        bDecimal = False
        If e.KeyCode = Keys.Decimal Then bDecimal = True

       


    End Sub
    Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)

        If bDecimal Then e.KeyChar = decSymbol ' здесь функция определяющая региональный разделитель


    End Sub


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


Код: Выделить всё
Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)
     
        If e.KeyCode = Keys.Decimal Then

                dim e1 as new KeyEventArgs(key.Z)' в данном случае непринципиальная замена клавиши, толко для примера
                 mybase.OnKeyDown(e1)' думал, что дальше пойдет другое значение, и правда в событии нажатия формы другое, затем в событии нажатия, скажем текстБокса 'старое. e.Handle=False поигрался, но ничего.
                 return

       end if
       

mybase.OnKeyDown(e)
    End Sub





Бедному программисту остается воспользоваться способом номер 2.



Здесь не могу с вами согласится, пользователю ни к чему смотреть на мешанину точек и запятых или слешей, до того как это будет отпарсено. Если же парсить сразу с вводом информации, то я заменой кнопки тем и занимаюсь собственно. Уверен вы со мной согласитесь, что поставленной задаче -"я хочу набирать на цифровой клавиатуре числа как в екселе"- подход с заменой нажатия кнопки точки на цифровой клавиатуре на нажатие "разделителя" просто оптимален, как для пользователя, так и для меня. Просмотр введенных данных на пример "числа" или других неправильных данных, можно осуществить окончания ввода, хотя в идеале прямо во время ввода, но боюсь не стоит овчинка выделки из-за многочисленных дальнейших условий. Например нажатие минуса - может быть и ошибкой ввода, а может началом отрицательного числа. И это только с легкими ограничениями по поводу "число не число", не считая всевозможных других ограничений.


P.S. Пространные комментарий в коде можно вставлять?


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList