2010-08-20 4 views
1

J'ai un seul PC avec plusieurs claviers, tous les voyants de verrouillage s'allument/s'éteignent de manière synchrone. (donc si un utilisateur/clavier allume la casquette, tout le monde tape en majuscule)Puis-je activer/désactiver le voyant Capslock sur les claviers individuels?

Je pensais enregistrer l'état de verrouillage de chaque clavier dans les drapeaux mais je viens de réaliser que les lumières ne correspondent pas pour le verrouillage de chaque utilisateur/clavier statut.
Je veux juste savoir si la lumière caplock peut être activée/désactivée indépendamment. Je prévois déjà de désactiver le verrouillage (puisque je n'aime pas vraiment cette touche), mais au cas où le client voudrait l'utiliser, je peux soit trouver un moyen de le faire, soit lui dire que c'est impossible.

Répondre

2

essayer

http://www.codeguru.com/Cpp/W-P/system/keyboard/article.php/c2825

un peu impliqué, mais faisable :)

+0

whoa. C'est beaucoup de travail. Merci de répondre. Est-ce que cela fonctionne sur XP? Je vais essayer de faire ça à delphi et le modifier à partir de là. – Dian

+1

oui, mais vous serez ninja :) –

+2

Quelle partie se qualifie pour le statut "ninja"? Traduire le code C en Delphi, ou adapter le code pour travailler sous Windows XP? Si le premier, alors vous devez repenser votre système de notation parce que ce code est assez simple. Dans ce dernier cas, pourriez-vous décrire certains des obstacles auxquels Dian et d'autres seraient confrontés pour que le code fonctionne dans les versions ultérieures de Windows? –

0

vous pouvez Programmatically obtenir et définir l'état des touches Verr en utilisant la fonction keybd_event
essayez ceci:

var 
    KeyState: TKeyboardState; 
begin 
    GetKeyboardState(KeyState) ; 
    if (KeyState[VK_CAPITAL] = 0) then 
    begin //simulate key down 
     Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0) ; 
     Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0) ; 
    end 
    else 
    begin //simulate key up 
     Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0) ; 
     Keybd_Event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0) ; 
    end; 

si vous voulez vraiment désactiver une clé (que je ne recommande pas), vous pouvez utiliser cette bibliothèque appelée BlockKeys (je l'ai trouvé à la bibliothèque BlockKeys http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21504230.html):

library BlockKeys; 

uses 
    Windows, 
    Messages; 

{$R *.RES} 

var 
hKeyHook: THandle = 0; 
Hooked: Boolean = False; 

function HookFunc(Code, VirtualKey, KeyStroke: Integer): Integer; stdcall; 
begin 
if VirtualKey in [VK_TAB, VK_CONTROL, VK_MENU, VK_ESCAPE, VK_F1] then 
    Result := 32 
    else 
    Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke); 
end; 


function StartHook: Boolean; export; 
begin 
Result := False; 
if Hooked then 
    begin 
    Result := True; 
    Exit; 
    end; 

hKeyHook := SetWindowsHookEx(WH_KEYBOARD, HookFunc, hInstance, 0); 
if hKeyHook <> 0 then 
    begin 
    Result := True; 
    Hooked := True; 
    end; 
end; 


function StopHook: Boolean; export; 
begin 
if Hooked then 
    Result := UnhookWindowsHookEx(hKeyHook) 
    else 
    Result := True; 
if Result then Hooked := False; 
end; 

exports 
    StartHook, 
    StopHook; 

begin 

end. 

espérons que cette aide

+0

Ceci ne contrôle pas l'état des lumières. Il manipule l'état de verrouillage des caps du système d'exploitation en faisant semblant d'appuyer sur une touche. C'est ignorer le problème qu'il y a plusieurs claviers, chacun avec son propre jeu de lumières. Vous pouvez avoir un verrouillage des majuscules sur un clavier pendant que l'autre est normal. –

+0

@rob merci de souligner, devrais-je supprimer ma réponse? –

Questions connexes