none
Visual Studio 2003 проблема RRS feed

  • Вопрос

  • В Visual Studio 2003 отсутствует какой либо способ для определения состояния клавиш Caps Lock и Num Lock. Если кто знает как можно реализовать данную задачу, откликнитесь.

     

    4 февраля 2007 г. 20:31

Все ответы

  • The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer.

    Syntax

    BOOL GetKeyboardState(      

        PBYTE lpKeyState );

    Parameters

    lpKeyState
    [in] Pointer to the 256-byte array that receives the status data for each virtual key.

    Return Value

    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.



    Remarks

    An application can call this function to retrieve the current status of all the virtual keys. The status changes as a thread removes keyboard messages from its message queue. The status does not change as keyboard messages are posted to the thread's message queue, nor does it change as keyboard messages are posted to or retrieved from message queues of other threads. (Exception: Threads that are connected through AttachThreadInput share the same keyboard state.)

    When the function returns, each member of the array pointed to by the lpKeyState parameter contains status data for a virtual key. If the high-order bit is 1, the key is down; otherwise, it is up. If the key is a toggle key, for example CAPS LOCK, then the low-order bit is 1 when the key is toggled and is 0 if the key is untoggled. The low-order bit is meaningless for non-toggle keys. A toggle key is said to be toggled when it is turned on. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

    To retrieve status information for an individual key, use the GetKeyState function. To retrieve the current state for an individual key regardless of whether the corresponding keyboard message has been retrieved from the message queue, use the GetAsyncKeyState function.

    An application can use the virtual-key code constants VK_SHIFT, VK_CONTROL and VK_MENU as indices into the array pointed to by lpKeyState. This gives the status of the SHIFT, CTRL, or ALT keys without distinguishing between left and right. An application can also use the following virtual-key code constants as indices to distinguish between the left and right instances of those keys:

    VK_LSHIFT
    VK_RSHIFT
    VK_LCONTROL
    VK_RCONTROL
    VK_LMENU
    VK_RMENU

    These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions.

    Function Information

    Minimum DLL Version user32.dll
    Header Declared in Winuser.h, include Windows.h
    Import library User32.lib
    Minimum operating systems Windows 95, Windows NT 3.1
    5 февраля 2007 г. 14:48
  • Спасибо за ответ. Я не настолько начинающий программист! :) Я знаю о всемогуществе WinAPI. Но используя WinAPI вы привязываетесь к конкретной платформе. По этому я ищу именно решение основанное на платформе .Net Framework 1.0. Эта возможность реализованна в .Net Framework 2.0. Там есть библиотека с функцией для определения статуса клавиши.

    Думал что в Framework 1.0 есть аналогичная, но не нашел.

    Придеться искать извращенные методы. На Caps Lock уже нашел, сейчас ищу на Num Lock.

    Еще раз спасибо.

    7 февраля 2007 г. 13:56
  • Для получения правильных ответов тогда максимально конкретизируйте вопрос.

    В Framework 1.1 есть такой пример обработки события контрола.


    // Handle the KeyDown event to determine the type of character entered into the control.
    private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {

        // Determine whether the keystroke is a number from the top of the keyboard.
        if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)                                 

    /*

    CapsLock

    кейкод капслока вставить  см выше

    The CAPS LOCK key. 20
    */
        {
            // Determine whether the keystroke is a number from the keypad.
            if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
            {
                // Determine whether the keystroke is a backspace.
                if(e.KeyCode != Keys.Back)
                {
                    // A non-numerical keystroke was pressed.
                    // Set the flag to true and evaluate in KeyPress event.
                    nonNumberEntered = true;
                }
            }
        }
    }


     

    7 февраля 2007 г. 14:43
  • Вопрос не стаит о том, как отловить событие нажатия клавиш Caps Lock и Num Lock. Нужно узнать состояние этих переключателей в произвольный момент времени. Проблема состоит в том что когда приложение запускаеться то не известно состояние этих переключателей, так как они действуют на системном уровне. И если пользователь сделает активным другое приложение и переключит состояние то по возвращению в наше приложение состояние должно будет проверенно и измененно.

    А вообще задача состоит в создании панели на которой будет отображаться время, юзернэйм, и состояние caps lock, num lock и переключателя INS. Время и юзер нэим не проблема но вот как отловить другие параметры не знаю.

    Если знаете как, то помогите реализовать эту не сложную задачу.

    8 февраля 2007 г. 18:04