没有鼠标的时候可以用键盘模拟,我用的是F2+上下左右 Insert Home模拟上下左右和左右键,还算不错
注意:用F2键是因为按这个键一般是保存和重命名;Insert键不会导致光标移动,home键没有什么附带坏的影响
#include <Windows.h>
#include <atlbase.h>
#include <atlwin.h>
#include <atltypes.h>
/********************************************************************
*
* 实现用键盘控制鼠标,解决没有鼠标的时候操作
*
********************************************************************/
class CCursorWindow
: public CWindowImpl<CCursorWindow>
{
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID)
{
BOOL bHandled = TRUE;
switch(dwMsgMapID)
{
case 0:
{
switch(uMsg)
{
case WM_ERASEBKGND:
{
HDC dc = (HDC)wParam;
RECT rcClient;
::GetClientRect(hWnd, &rcClient);
HBRUSH br = CreateSolidBrush(RGB(200, 0, 255));
::FillRect(dc,&rcClient, br);
::DeleteObject(br);
lResult = 1;
return TRUE;
}
break;
}
}
break;
default:
ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)\n"), dwMsgMapID);
ATLASSERT(FALSE);
break;
}
return FALSE;
}
virtual void OnFinalMessage(HWND ff)
{
PostQuitMessage(0);//销毁后窗口走到最终结束的时候推出消息循环
}
public:
CCursorWindow() {}
~CCursorWindow() {}
};
CCursorWindow g_wndCursor;//一个顶层窗口当作指针
void MoveMouseCursor(int dx, int dy)
{
if(::IsWindow(g_wndCursor.m_hWnd))
{
RECT rcW;
::GetWindowRect(g_wndCursor.m_hWnd, &rcW);
::OffsetRect(&rcW, dx, dy);
if(rcW.left < 0)
rcW.left = 0;
if(rcW.top < 0)
rcW.top = 0;
if(rcW.left > 2000)
rcW.left = 2000;
if(rcW.top > 2000)
rcW.top = 2000;
rcW.right = rcW.left + 10;
rcW.bottom = rcW.top + 10;
::SetWindowPos(g_wndCursor.m_hWnd, 0, rcW.left, rcW.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
}
DWORD WINAPI loopProc(LPVOID lpp)
{
while(1)
{
do
{
static bool bInsKeyDown = false;
static bool bLeftKeyDown = false;
static bool bHomeKeyDown = false;
static bool bRightKeyDown = false;
BOOL bF2 = 0;
BOOL bF6 = 0;
if(::GetKeyState(VK_F2) & 0x8000)
{
bF2 = TRUE;
}
if(::GetKeyState(VK_F6) & 0x8000)
{
bF6 = TRUE;
}
/********************************************************************
*
* 当使用F2开启时,Ins Home 采用Click模式
* 当使用F3开启是 采用 Down Up模式
*
********************************************************************/
if(bF6 || bF2)
{
if(::GetKeyState(VK_UP) & 0x8000)
MoveMouseCursor(0, -3);
if(::GetKeyState(VK_DOWN) & 0x8000)
MoveMouseCursor(0, 3);
if(::GetKeyState(VK_LEFT) & 0x8000)
MoveMouseCursor(-3, 0);
if(::GetKeyState(VK_RIGHT) & 0x8000)
MoveMouseCursor(3, 0);
}
if(bF2)
{
if(::GetKeyState(VK_INSERT) & 0x8000)
{
if(::IsWindow(g_wndCursor.m_hWnd))
{
RECT rcW;
::GetWindowRect(g_wndCursor.m_hWnd, &rcW);
::SetCursorPos(rcW.left - 1, rcW.top);
mouse_event(MOUSEEVENTF_LEFTDOWN, rcW.left, rcW.top, 0, 0);
::Sleep(300);
mouse_event(MOUSEEVENTF_LEFTUP, rcW.left, rcW.top, 0, 0);
}
}
if(::GetKeyState(VK_HOME) & 0x8000)
{
if(::IsWindow(g_wndCursor.m_hWnd))
{
RECT rcW;
::GetWindowRect(g_wndCursor.m_hWnd, &rcW);
::SetCursorPos(rcW.left - 1, rcW.top);
mouse_event(MOUSEEVENTF_RIGHTDOWN, rcW.left, rcW.top, 0, 0);
::Sleep(300);
mouse_event(MOUSEEVENTF_RIGHTUP, rcW.left, rcW.top, 0, 0);
}
}
}
else if(bF6)
{
if(::GetKeyState(VK_INSERT) & 0x8000)
{
if(!bInsKeyDown)
{
bInsKeyDown = true;
if(::IsWindow(g_wndCursor.m_hWnd))
{
RECT rcW;
::GetWindowRect(g_wndCursor.m_hWnd, &rcW);
::SetCursorPos(rcW.left - 1, rcW.top);
if(!bLeftKeyDown)
{
mouse_event(MOUSEEVENTF_LEFTDOWN, rcW.left, rcW.top, 0, 0);
bLeftKeyDown = true;
}
else
{
mouse_event(MOUSEEVENTF_LEFTUP, rcW.left, rcW.top, 0, 0);
bLeftKeyDown = false;
}
}
}
}
else
{
bInsKeyDown = false;
}
if(::GetKeyState(VK_HOME) & 0x8000)
{
if(!bHomeKeyDown)
{
bHomeKeyDown = true;
if(::IsWindow(g_wndCursor.m_hWnd))
{
RECT rcW;
::GetWindowRect(g_wndCursor.m_hWnd, &rcW);
::SetCursorPos(rcW.left - 1, rcW.top);
if(!bRightKeyDown)
{
mouse_event(MOUSEEVENTF_RIGHTDOWN, rcW.left, rcW.top, 0, 0);
bRightKeyDown = true;
}
else
{
mouse_event(MOUSEEVENTF_RIGHTUP, rcW.left, rcW.top, 0, 0);
bRightKeyDown = false;
}
}
}
}
else
{
bHomeKeyDown = false;
}
}
}
while(0);
::Sleep(1);
}
}
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
//CreateWindow
HWND hCursorWnd = g_wndCursor.Create(0, &CRect(0, 0, 4, 4), L"", WS_VISIBLE, WS_EX_TOPMOST | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT);
if(hCursorWnd)
{
::SetWindowLong(hCursorWnd, GWL_STYLE, ::GetWindowLong(hCursorWnd, GWL_STYLE) & ~(WS_BORDER|WS_CAPTION));
::CreateThread(0, 0, loopProc, 0, 0, 0);
MSG msg;
while(::GetMessage(&msg, 0, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return 0;
}
MessageBox(0, L"CreateCursorWindowFail", 0, 0);
return 0;
}