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

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

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


#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



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



目录
相关文章
|
2月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
71 6
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
106 10
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
73 5
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
59 1
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
52 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
25 0
C++ 多线程之线程管理函数
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
32 3
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
211 1
|
2月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
35 1