获取、设定和限定鼠标位置
#include <iostream> #include <windows.h> using namespace std; #define MOUSE_Click(mButton) (GetAsyncKeyState(mButton)&0x8000?1:0) bool CenterWindow(RECT &rect, RECT &desktop) { //使窗口移动到桌面居中位置 int width,height,dtWidth,dtHeight; bool bSuccess=false; HWND hwnd = GetDesktopWindow(); GetWindowRect(hwnd,&desktop); dtWidth=desktop.right-desktop.left; dtHeight=desktop.bottom-desktop.top; hwnd = GetForegroundWindow(); GetWindowRect(hwnd,&rect); width=rect.right-rect.left; height=rect.bottom-rect.top; bSuccess=MoveWindow(hwnd,(dtWidth-width)/2,(dtHeight-height)/2,width,height,true); GetWindowRect(hwnd,&rect); return bSuccess; } void gotoXY(short x, short y) { COORD position = {x, y}; HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsole, position); } int main(void) { int mx,my; bool bSuccess=false; POINT mouse; //用来储存鼠标的x,y坐标 RECT Rect,rectDesktop; char t[]="windows.h库函数鼠标操作测试"; SetConsoleTitle(t); bSuccess=CenterWindow(Rect,rectDesktop); //窗体居中并引用传递回窗体和桌面尺寸 if (bSuccess){ gotoXY(12,6); cout<<"窗口已移到屏幕正中间位置!"; } while(1){ GetCursorPos(&mouse); //调用GetCursorPos函数获取坐标值 gotoXY(12,8); cout<<"鼠标的位置坐标(单击左键退出): "; if (mouse.x!=mx&&mouse.y!=my) cout<<mouse.x<<","<<mouse.y<<"\t"; Sleep(50); mx=mouse.x; my=mouse.y; if(MOUSE_Click(VK_LBUTTON)) break; //单击鼠标左键中止循环 } gotoXY(16,8); cout<<"已被锁定在控制台所在区域内!(单击右键退出)"; while(1){ ClipCursor(&Rect); // 限制鼠标移动区域 Sleep(50); if(MOUSE_Click(VK_RBUTTON)){ ClipCursor(&rectDesktop); //单击鼠标右键中止循环 break; } } gotoXY(0,15); return 0; }
结构体 POINT
typedef struct tagPOINT { LONG x; //x Specifies the x-coordinate of the point. LONG y; //y Specifies the y-coordinate of the point. } POINT;
函数:short GetAsyncKeyState(int nVirtKey);
功能:获取当前是否按下键盘或鼠标上的一个键,对应虚拟键码值nVirtKey。
函数:GetCursorPos(POINT&);
功能:获取鼠标的坐标,与之对应的设定坐标:SetCursorPos(POINT&);
函数:ClipCursor(RECT&);
功能:限定鼠标的活动范围。
常用键的VK值:
VK_LBUTTON 鼠标左键 VK_RBUTTON 鼠标右键 VK_MBUTTON 鼠标中键 (滚轮)
VK_SHIFT Shift键 VK_LSHIFT 左Shift键 VK_RSHIFT 右Shift键
VK_CONTROL Ctrl键 VK_LCONTROL 左Ctrl键 VK_RCONTROL 右Ctril键
VK_MENU Alt键 VK_LMENU 左Alt键 VK_RMENU 右Alt键
VK_ESCAPE ESC键 VK_RETURN 回车键
VK_TAB TAB键 VK_SPACE 空格键
VK_UP ↑ 键 VK_DOWN ↓ 键
VK_LEFT ←键 VK_RIGHT →键
注:仅当调用GetKeyboardState,SetKeyboardState,GetAsyncKeystate;GetKeyState和MapVirtualKey函数时,才能用区分左右键的常数。
KeyState与AsyncKeyState区别:
GetAsyncKeyState在按下某键的同时调用,判断正在按下某键。GetKeyState则在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。
比如,一般情况下,你可以在操作系统的控制面板中设置鼠标左右键的映射(实际的鼠标左键可以映射成右键点击事件),或者通过程序也可以这样设置,这样就产生了物理键状态(实际的),逻辑键状态(虚拟的)。使用 GetKeyState,GetKeyboardState等函数得到的就是逻辑键状态。而GetAsyncKeyState 读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。
附录:虚拟键码表
VK_LBUTTON 鼠标左键 0x01
VK_RBUTTON 鼠标右键 0x02
VK_CANCEL CANCEL ?? 0x03
VK_MBUTTON 鼠标中键 0x04
VK_XBUTTON1 鼠标X1键 0x05
VK_XBUTTON2 鼠标X2键 0x06
VK_BACK Backspace 键 0x08
VK_TAB Tab 键 0x09
VK_RETURN 回车键 0x0D
VK_SHIFT Shift 键 0x10
VK_CONTROL Ctrl 键 0x11
VK_MENU Alt 键 0x12
VK_PAUSE Pause 键 0x13
VK_CAPITAL Caps Lock 键 0x14
VK_ESCAPE Esc 键 0x1B
VK_SPACE 空格键 0x20
VK_PRIOR Page Up 键 0x21
VK_NEXT Page Down 键 0x22
VK_END End 键 0x23
VK_HOME Home 键 0x24
VK_LEFT 左箭头键 0x25
VK_UP 上箭头键 0x26
VK_RIGHT 右箭头键 0x27
VK_DOWN 下箭头键 0x28
VK_SNAPSHOT Print Screen 键 0x2C
VK_INSERT Insert 键 0x2D
VK_DELETE Delete 键 0x2E
'0' – '9' 数字 0 - 9 0x30 - 0x39
'A' – 'Z' 字母 A - Z 0x41 - 0x5A
VK_LWIN 左WinKey 0x5B
VK_RWIN 右WinKey 0x5C
VK_APPS AppsKey 0x5D
VK_NUMPAD0 小键盘 0 键 0x60
VK_NUMPAD1 小键盘 1 键 0x61
VK_NUMPAD2 小键盘 2 键 0x62
VK_NUMPAD3 小键盘 3 键 0x63
VK_NUMPAD4 小键盘 4 键 0x64
VK_NUMPAD5 小键盘 5 键 0x65
VK_NUMPAD6 小键盘 6 键 0x66
VK_NUMPAD7 小键盘 7 键 0x67
VK_NUMPAD8 小键盘 8 键 0x68
VK_NUMPAD9 小键盘 9 键 0x69
VK_MULTIPLY 小键盘 * 键 0x6A
VK_ADD 小键盘 + 键 0x6B
VK_SEPARATOR Separator ?? 0x6C
VK_SUBTRACT 小键盘 - 键 0x6D
VK_DECIMAL 小键盘 . 键 0x6E
VK_DIVIDE 小键盘 / 键 0x6F
VK_F1 - VK_F24 功能键F1 – F24 0x70 - 0x87
VK_NUMLOCK Num Lock 键 0x90
VK_SCROLL Scroll Lock 键 0x91
VK_LSHIFT 左上档键Shift 0xA0
VK_RSHIFT 右上档键Shift 0xA1
VK_LCONTROL 左控制键Ctrl 0xA2
VK_RCONTROL 右控制键Ctrl 0xA3
VK_LMENU 左换挡键Alt 0xA4
VK_RMENU 右换挡键Alt 0xA5
VK_BROWSER_BACK 浏览器后退键 0xA6
VK_BROWSER_FORWARD 浏览器前进键 0xA7
VK_BROWSER_REFRESH 浏览器刷新键 0xA8
VK_BROWSER_STOP 浏览器停止键 0xA9
VK_BROWSER_SEARCH 浏览器查找键 0xAA
VK_BROWSER_FAVORITES 浏览器收藏夹键 0xAB
VK_BROWSER_HOME 浏览器主页键 0xAC
VK_VOLUME_MUTE 音量静音键 0xAD
VK_VOLUME_DOWN 音量调低键 0xAE
VK_VOLUME_UP 音量调高键 0xAF
VK_MEDIA_NEXT_TRACK 媒体下一曲目键 0xB0
VK_MEDIA_PREV_TRACK 媒体上一曲目键 0xB1
VK_MEDIA_STOP 媒体停止键 0xB2
VK_MEDIA_PLAY_PAUSE 媒体播放/暂停键 0xB3
VK_LAUNCH_MAIL 启动邮件键 0xB4
VK_LAUNCH_MEDIA_SELECT 启动媒体选择键 0xB5
VK_LAUNCH_APP1 启动应用程序1键 0xB6
VK_LAUNCH_APP2 启动应用程序2键 0xB7
注:跳空的键值是未作定义或是部分厂商非标准键盘上的特殊键或自定义功能键。