Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息(四)

简介: Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息

六.鼠标消息


1.鼠标消息分类

- 基本鼠标消息

  • WM_LBUTTONDOWN----鼠标左键按下
  • WM_RBUTTONDOWN----鼠标右键按下
  • WM_LBUTTONUP----鼠标左键抬起
  • WM_RBUTTONUP----鼠标右键抬起
  • WM_MOUSEMOVE----鼠标移动消息

- 双击消息

  • WM_LBUTTONBLOCK----鼠标左键双击
  • WM_RBUTTONBLOCK----鼠标右键双击

- 滚轮消息

  • WM_MOUSEWHEEL----鼠标滚轮消息

2.鼠标基本消息

  • WM_LBUTTONDOWN----鼠标左键按下
  • WM_RBUTTONDOWN----鼠标右键按下
  • WM_LBUTTONUP----鼠标左键抬起
  • WM_RBUTTONUP----鼠标右键抬起
  • WM_MOUSEMOVE----鼠标移动消息
  • 产生时间:当鼠标有动作时
  • 附加信息:
  • wParam:其他按键状态,例如Ctrl/Shift按键状态
  • lParam:鼠标的位置,窗口客户区坐标系
  • LOWORD x
  • HIWORD y
  • 一般情况下,按下/抬起消息成对出现,在鼠标移动过程中,会根据移动速度,产生一系列WM-MOUSEMOVE消息。

3.鼠标双击消息

  • WM_LBUTTONBLCLK----鼠标左键双击
  • WM_RBUTTONBLCLK----鼠标右键双击
  • 附加信息:
  • wParam:其他按键状态(Ctrl,Shift等)
  • lParam:鼠标位置,窗口客户区坐标系
  • 消息产生顺序:
  • 这里我们以双击左键为例:
  • 1.WM_LBUTTONDOWN
  • 2.WM_LBUTTONUP
  • 3.WM_LBUTTONBLCLK
  • 4.WM_LBUTTONUP
  • 使用时注意要在注册窗口时增加CS_DBLCLKS风格

4.鼠标滚轮消息

WM_MOUSEWHEEL

  • 附加信息:
  • wParam:
  • LOWORD: 其他按键状态
  • HIWORD:滚轮的偏移量,通过正负值可以确定滚轮滚动方向(正:向前滚动,负:向后滚动
  • lParam:鼠标当前位置(屏幕坐标系)
  • LOWORD:x
  • HIWORD:y
  • 使用:通过偏移量,获取滚动方向和距离

我们来到回调函数中来处理鼠标消息:

LRESULT CALLBACK WindowProc(
  IN  HWND hwnd,
  IN  UINT uMsg,
  IN  WPARAM wParam,
  IN  LPARAM lParam
)
{
  char output[256] = { 0 };
  switch (uMsg)
  {
  //常见消息
  case WM_QUIT: {
    MessageBox(hwnd, "确定退出程序吗?", "退出", MB_YESNO);
    break;
  }
  case WM_DESTROY: {
    sprintf(output, TEXT("窗口即将被销毁,将向消息队列中发送WM_QUIT消息"));
    WriteConsole(g_hOUTPUT,output,strlen(output), 0, 0);
    PostMessage(NULL, WM_QUIT, 0, 0);
    break;
    }
  case WM_SYSCOMMAND: {
      sprintf(output, TEXT("检测到WM_COMMAND消息,将弹出提示窗口\n"));
      WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
      MessageBox(hwnd, "记住我!!!", "别忘了", MB_YESNO);
    break;
  }
  case WM_CREATE: {
    sprintf(output, TEXT("检测到WM_CREATE消息,将创建窗口。\n"));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_SIZE: {
    sprintf(output, "lParam:窗口宽变化为:%d,窗口高变化为:%d \n", HIWORD(lParam), LOWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  //键盘消息
  case WM_KEYDOWN: {
    sprintf(output, "检测到WM_KEYDOWN消息,键码值:%d.\n", wParam);
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_KEYUP: {
    sprintf(output, "检测到WM_KEYUP消息,键码值:%d.该按键被放开\n", wParam);
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  //鼠标消息
  case WM_LBUTTONDOWN: {
    sprintf(output, "检测到WM_LBUTTONDOWN消息,鼠标左键被按下。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_LBUTTONUP: {
    sprintf(output, "检测到WM_LBUTTONUP消息,鼠标左键被放开。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output),0,0);
    break;
  }
  case WM_RBUTTONDOWN: {
    sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被按下。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_RBUTTONUP: {
    sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被放开。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
  }
  case WM_MOUSEMOVE: {
    sprintf(output, "检测到WM_MOUSEMOVE消息,鼠标移动中,鼠标位置(%d,%d).\n", LOWORD(lParam), HIWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_MOUSEWHEEL: {
    sprintf(output, "鼠标滚轮滚动中,偏移量:%d,鼠标当前位置(%d,%d)\n",HIWORD(wParam), LOWORD(lParam), HIWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  }
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

我看看看处理效果:


七.定时器消息

1.定时器消息介绍

  • 产生时间:
    在程序中创建定时器,当达到时间间隔时,定时器会向(实际上是GetMessage函数)程序发送一个WM-TIMER消息。定时器的精度是毫秒,但是准确度极低(原因是:我们在上文中深谈GetMessage函数的时候讲过,当没有消息时,GetMessage函数会做很多事情,只有当前面的事都做完了之后才会检查定时器),例如设置间隔为1000ms,但是会在非1000ms时发送消息。
  • 附加消息:
  • wParam:定时器ID
  • lParam:定时器出席函数的指针

2.创建和销毁定时器

  • 创建定时器
UINT_PTR SetTimer(
  HWND hWnd,              //定时器窗口句柄
  UINT_PTR nIDEvent,      //定时器ID
  UINT uElapse,           //时间间隔(ms)
  TIMEPROC lpTimeFunc     //定时器函数处理指针,一般不使用,设置为NULL
  );创建成功返回非0,失败返回0
  • 关闭定时器
BOOL killTimer(
  HWND hWnd,        //定时器窗口聚句柄
  UINT UideVENT     //定时器ID
  );

今天的内容就分享到这里,如果文章中出现错误之处或者是我个人理解不到位的地方,还请大家指出来,我会非常虚心地学习,下一篇文章我们来为大家讲解Windows程序资源。

相关文章
|
Shell 开发者 Windows
windows 10中将任意程序添加进鼠标右键菜单里面
windows 10中将任意程序添加进鼠标右键菜单的详细步骤
212 0
windows 10中将任意程序添加进鼠标右键菜单里面
|
11月前
|
Windows
2.6 Windows驱动开发:使用IO与DPC定时器
本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔,微秒级别间隔,就需要用到DPC定时器,如果是秒级定时其两者基本上无任何差异,本章将简单介绍`IO/DPC`这两种定时器的使用技巧。首先来看IO定时器是如何使用的,IO定时器在使用上需要调用`IoInitializeTimer`函数对定时器进行初始化,但需要注意的是此函数每个设备对象只能调用一次,当初始化完成后用户可调用`IoStartTimer`让这个定时器运行,相反的调用`I
77 0
2.6 Windows驱动开发:使用IO与DPC定时器
|
11月前
windows10为何鼠标右键失灵,桌面右键一直转圈的解决
windows10为何鼠标右键失灵,桌面右键一直转圈的解决
1065 0
keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案
keychron K3 键盘和 Windows11 操作系统的笔记本电脑通过蓝牙配对出现问题的解决方案
|
消息中间件 Windows
Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息(三)
Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息(三)
|
消息中间件 Windows
Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息(二)
Windows消息,消息循环的处理,消息队列,键盘消息,鼠标消息,定时器消息
|
消息中间件 Python Windows
python 在windows下监听键盘按键
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), 将用户定义的钩子函数添加到钩子链中, 也就是我们的注册钩子函数 UnhookWindowsH...
3274 0
|
28天前
|
网络安全 虚拟化 Windows
windows 11安装openSSH server 遇到的"kex_exchange_identification: read: Connection reset"问题
windows 11安装openSSH server 遇到的"kex_exchange_identification: read: Connection reset"问题
|
2月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
2月前
|
开发框架 .NET API
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
81 0