zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++ <windows.h>库函数探究初步续一:键鼠操作

C++Windows 操作 探究 初步 库函数
2023-09-14 09:01:28 时间

获取、设定和限定鼠标位置

#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

注:跳空的键值是未作定义或是部分厂商非标准键盘上的特殊键或自定义功能键。