////////////////////////////////////////////////////////////////////// // // MxKeys.PRG // // Copyright: // Maniacc Software Inc., (c) 2003. All rights reserved. To obtain rights to use // this code, please contact me at joe.carrick@att.net // // Contents: // ******************************************************************************** // Keyboard Status Functions // ******************************************************************************** // ////////////////////////////////////////////////////////////////////// #include "MxKeys.ch" #include "Dll.ch" #pragma Library( "BAP.LIB" ) DLLFUNCTION GetKeyState( nVirtKey ) USING STDCALL FROM USER32.DLL DLLFUNCTION GetKeyboardState( @cKeyStates ) USING STDCALL FROM USER32.DLL DLLFUNCTION SetKeyboardState( @cKeyStates ) USING STDCALL FROM USER32.DLL DLLFUNCTION keybd_event( nVirtKey, nScanCode, nFlags, nExtra ) USING STDCALL FROM USER32.DLL DLLFUNCTION SendInput( nIputs, @cBuffer, nBufLen ) USING STDCALL FROM USER32.DLL *********************************************************************** * FUNCTION Capslock( [lLock] ) -> lOldLocked *********************************************************************** FUNCTION Capslock( lLock ) LOCAL nByte, nNewByte LOCAL cBuffer := space(256) LOCAL aBuf1, aBuf2, cBuf, nType, nVkey, nScan, nFlags, nTime, nExtra nType := INPUT_KEYBOARD nVkey := VK_CAPITAL nScan := 58 nTime := 0 nExtra := 0 *********************************************************** * Following Code requires the BAP Library *********************************************************** aBuf1 = BaInit(7) // BAP.DLL from Gernot Trautmann nFlags := KEYEVENTF_EXTENDEDKEY BaStruct(aBuf1,16) // lStructSize BaStruct(aBuf1,nType) // type BaStruct(aBuf1,nVkey) // virtual key BaStruct(aBuf1,nScan) // scan code BaStruct(aBuf1,nFlags) // flags BaStruct(aBuf1,nTime) // time BaStruct(aBuf1,nExtra) // extraInfo cBuf1 = BaAccess(aBuf1) aBuf2 = BaInit(7) // BAP.DLL from Gernot Trautmann nFlags := KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP BaStruct(aBuf2,16) // lStructSize BaStruct(aBuf2,nType) // type BaStruct(aBuf2,nVkey) // virtual key BaStruct(aBuf2,nScan) // scan code BaStruct(aBuf2,nFlags) // flags BaStruct(aBuf2,nTime) // time BaStruct(aBuf2,nExtra) // extraInfo cBuf2 = BaAccess(aBuf2) nByte := GetKeyState(VK_CAPITAL) // if nByte[1] then CapsLock is ON if lLock == Nil return nByte[1] elseif lLock .and. !nByte[1] // Turn CapsLock ON SendInput( 1, cBuf1, len(cBuf1) ) SendInput( 1, cBuf2, len(cBuf2) ) cBuf1 := U2Bin(nType)+W2Bin(nVkey)+W2Bin(nScan)+W2Bin(KEYEVENTF_EXTENDEDKEY)+U2Bin(nTime)+U2Bin(nExtra) SendInput( 1, cBuf1, len(cBuf1) ) cBuf2 := U2Bin(nType)+W2Bin(nVkey)+W2Bin(nScan)+W2Bin(KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP)+U2Bin(nTime)+U2Bin(nExtra) SendInput( 1, cBuf2, len(cBuf2) ) if !GetKeyState(VK_CAPITAL)[1] keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) endif elseif !lLock .and. nByte[1] // Turn CapsLock OFF GetKeyboardState( @cBuffer ) nNewByte := asc(cBuffer[VK_CAPITAL]) nNewByte[1] := .F. cBuffer[VK_CAPITAL] := chr(nNewByte) SetKeyboardState( @cBuffer ) keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_CAPITAL, 58, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) endif RETURN nByte[1] *********************************************************************** * FUNCTION Numlock( [lLock] ) -> lOldLocked *********************************************************************** FUNCTION Numlock( lLock ) LOCAL nByte PRIVATE aKeyState := space(256) nByte := GetKeyState(VK_NUMLOCK) // if nByte[1] then NumLock is ON if lLock == Nil return nByte[1] elseif lLock .and. !nByte[1] // Turn NumLock ON keybd_event( VK_NUMLOCK, 69, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_NUMLOCK, 69, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) elseif !lLock .and. nByte[1] // Turn NumLock OFF keybd_event( VK_NUMLOCK, 69, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_NUMLOCK, 69, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) endif RETURN nByte[1] *********************************************************************** * FUNCTION ScrollLock( [lLock] ) -> lOldLocked *********************************************************************** FUNCTION ScrollLock( lLock ) LOCAL nByte PRIVATE aKeyState := space(256) nByte := GetKeyState(VK_SCROLL) // if nByte[1] then ScrollLock is ON if lLock == Nil return nByte[1] elseif lLock .and. !nByte[1] // Turn ScrollLock ON keybd_event( VK_SCROLL, 70, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_SCROLL, 70, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) elseif !lLock .and. nByte[1] // Turn ScrollLock OFF keybd_event( VK_SCROLL, 70, KEYEVENTF_EXTENDEDKEY, 0 ) keybd_event( VK_SCROLL, 70, KEYEVENTF_EXTENDEDKEY + KEYEVENTF_KEYUP, 0 ) endif RETURN nByte[1] *********************************************************************** * FUNCTION KeyState( nvKey ) -> lPressed *********************************************************************** FUNCTION KeyState( nvKey ) LOCAL nByte, lPressed nByte := GetKeyState( nvKey ) // if nByte[8] then nvKey is Down if nvKey == Nil Msgbox("No key was specified") lPressed := Nil else lPressed := nByte[8] endif RETURN lPressed