实现键盘操作鼠标的简单程序

没有鼠标的时候可以用键盘模拟,我用的是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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值