#include "stdafx.h" #include "Hid_IF.h" #include "AutoFunc.h" Hid_IF::Hid_IF() { m_KeyStatus = new map(); m_MouseKeyStatus = new map(); } Hid_IF::~Hid_IF() { m_KeyStatus->clear(); delete m_KeyStatus; m_KeyStatus = NULL; m_MouseKeyStatus->clear(); delete m_MouseKeyStatus; m_MouseKeyStatus = NULL; } bool Hid_IF::InitKeyMap() { bool ret = true; //LIGHT_FUNCTION_BIT Light; //ret = GetLightStatus(&Light); //if (ret) //{ // if (Light.CapsLock) // { // ret &= Key_Hit(HID_CAPSLOCK); // } // if (Light.ScrollLock) // { // ret &= Key_Hit(HID_SCROLLLOCK); // } // if (Light.NumLock == 0) // { // ret &= Key_Hit(HID_NUMLOCK); // } // KEY_CMD cmd; // InitKeyNode(&cmd); // ret &= PostKeyCmd(&cmd);//clear all //} m_KeyStatus->clear(); return ret; } bool Hid_IF::InitMouseMap() { bool ret = true; //MOUSE_CMD cmd; //InitMouseNode(&cmd); //ret = PostMouseCmd(&cmd);//clear all (*m_MouseKeyStatus)[MOUSEKEYLEFT] = false; (*m_MouseKeyStatus)[MOUSEKEYRIGHT] = false; (*m_MouseKeyStatus)[MOUSEKEYMIDDLE] = false; return ret; } bool Hid_IF::InitHid() { bool ret = FindHid(); if (ret) { ret &= InitKeyMap(); ret &= InitMouseMap(); } return ret; } void Hid_IF::MakeKeyTable(HID_KEY key,KEY_CMD *pCmd,BOOL Press) { if (key >= HID_LEFTCTRL && key <= HID_RIGHTWIN) { //left------------- if (key == HID_LEFTCTRL) { pCmd->Func_Cmd.KeyBits.LeftControl = Press; } if (key == HID_LEFTSHIFT) { pCmd->Func_Cmd.KeyBits.LeftShift = Press; } if (key == HID_LEFTALT) { pCmd->Func_Cmd.KeyBits.LeftAlt = Press; } if (key == HID_LEFTWIN) { pCmd->Func_Cmd.KeyBits.LeftWin = Press; } //right--------------- if (key == HID_RIGHTCTRL) { pCmd->Func_Cmd.KeyBits.RightControl = Press; } if (key == HID_RIGHTSHIFT) { pCmd->Func_Cmd.KeyBits.RightShift = Press; } if (key == HID_RIGHTALT) { pCmd->Func_Cmd.KeyBits.RightAlt = Press; } if (key == HID_RIGHTWIN) { pCmd->Func_Cmd.KeyBits.RightWin = Press; } return; } for (DWORD i = 0; i < 6; i++) { if (pCmd->Keys[i] != 0) { continue; } pCmd->Keys[i] = key; return; } return; } bool Hid_IF::Key_Down(HID_KEY key) { bool ret = false; KEY_CMD cmd; if (m_KeyStatus->size() >= 6) { return false; } InitKeyNode(&cmd); map::iterator iter = m_KeyStatus->begin(); while (iter != m_KeyStatus->end()) { MakeKeyTable(iter->first, &cmd, TRUE); ++iter; } MakeKeyTable(key, &cmd, TRUE); ret = PostKeyCmd(&cmd); if (ret) { //update map (*m_KeyStatus)[key] = true; } return ret; } bool Hid_IF::Key_Up(HID_KEY key) { bool ret = false; KEY_CMD cmd; InitKeyNode(&cmd); //update map map::iterator iter = m_KeyStatus->find(key); if (iter != m_KeyStatus->end()) { m_KeyStatus->erase(iter); } iter = m_KeyStatus->begin(); while (iter != m_KeyStatus->end()) { MakeKeyTable(iter->first, &cmd, TRUE); ++iter; } ret = PostKeyCmd(&cmd); if (ret) { //do err read char Res = 0; if (TryReadErrResponse(Res, 0)) { if (Res == 2) { //input is too quick Sleep(MAX_DELAY); } } } return ret; } bool Hid_IF::Key_Hit(HID_KEY key, DWORD timeout) { bool ret = Key_Down(key); if (ret) { //printf("Key Down OK\n"); Sleep(timeout); ret = Key_Up(key); if (ret) { //printf("Key Up OK\n"); } } return ret; } bool Hid_IF::MouseKey_Down(MOUSEKEYTYPE key) { bool ret = false; MOUSE_CMD cmd; InitMouseNode(&cmd); if (key == MOUSEKEYLEFT || (*m_MouseKeyStatus)[MOUSEKEYLEFT] == true) { cmd.Func_Cmd.MouseBits.LeftButton = 1; } if (key == MOUSEKEYRIGHT || (*m_MouseKeyStatus)[MOUSEKEYRIGHT] == true) { cmd.Func_Cmd.MouseBits.RightButton = 1; } if (key == MOUSEKEYMIDDLE || (*m_MouseKeyStatus)[MOUSEKEYMIDDLE] == true) { cmd.Func_Cmd.MouseBits.MiddleButton = 1; } ret = PostMouseCmd(&cmd); if (ret) { //update map (*m_MouseKeyStatus)[key] = true; } return ret; } bool Hid_IF::MouseKey_Up(MOUSEKEYTYPE key) { MOUSE_CMD cmd; InitMouseNode(&cmd); //init second if ((*m_MouseKeyStatus)[MOUSEKEYLEFT] == true) { cmd.Func_Cmd.MouseBits.LeftButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYRIGHT] == true) { cmd.Func_Cmd.MouseBits.RightButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYMIDDLE] == true) { cmd.Func_Cmd.MouseBits.MiddleButton = 1; } //update if (key == MOUSEKEYLEFT) { cmd.Func_Cmd.MouseBits.LeftButton = 0; } if (key == MOUSEKEYRIGHT) { cmd.Func_Cmd.MouseBits.RightButton = 0; } if (key == MOUSEKEYMIDDLE) { cmd.Func_Cmd.MouseBits.MiddleButton = 0; } bool ret = PostMouseCmd(&cmd); if (ret) { if (key == MOUSEKEYLEFT) { (*m_MouseKeyStatus)[MOUSEKEYLEFT] = false; } if (key == MOUSEKEYRIGHT) { (*m_MouseKeyStatus)[MOUSEKEYRIGHT] = false; } if (key == MOUSEKEYMIDDLE) { (*m_MouseKeyStatus)[MOUSEKEYMIDDLE] = false; } //do err read char Res = 0; if (TryReadErrResponse(Res, 0)) { if (Res == 4) { //input is too quick Sleep(MAX_DELAY); } } } return ret; } bool Hid_IF::MouseKey_Hit(MOUSEKEYTYPE key, DWORD timeout) { bool ret =MouseKey_Down(key); if (ret) { Sleep(timeout); ret = MouseKey_Up(key); } return ret; } bool Hid_IF::Mouse_Move(char x, char y) { MOUSE_CMD cmd; InitMouseNode(&cmd); //init second if ((*m_MouseKeyStatus)[MOUSEKEYLEFT] == true) { cmd.Func_Cmd.MouseBits.LeftButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYRIGHT] == true) { cmd.Func_Cmd.MouseBits.RightButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYMIDDLE] == true) { cmd.Func_Cmd.MouseBits.MiddleButton = 1; } cmd.X = x; cmd.Y = y; bool ret = PostMouseCmd(&cmd); if (ret) { //do err read char Res = 0; if (TryReadErrResponse(Res, 0)) { if (Res == 4) { //input is too quick Sleep(MAX_DELAY); } } } return ret; } bool Hid_IF::Mouse_Wheel(char offset) { MOUSE_CMD cmd; InitMouseNode(&cmd); //init second if ((*m_MouseKeyStatus)[MOUSEKEYLEFT] == true) { cmd.Func_Cmd.MouseBits.LeftButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYRIGHT] == true) { cmd.Func_Cmd.MouseBits.RightButton = 1; } if ((*m_MouseKeyStatus)[MOUSEKEYMIDDLE] == true) { cmd.Func_Cmd.MouseBits.MiddleButton = 1; } cmd.Wheel = offset; bool ret = PostMouseCmd(&cmd); if (ret) { //do err read char Res = 0; if (TryReadErrResponse(Res, 0)) { if (Res == 4) { //input is too quick Sleep(MAX_DELAY); } } } return ret; }