没有躲过的坑--捕获窗口之外的鼠标消息(钩子还是??)

做一个发送表情的对话框,类似微信和QQ一样的,点击表情按钮,弹出表情框,鼠标点击表情框外时,这个表情框被kill。

说白了 就是在这个窗口上获得窗口外面的鼠标消息。

Google百度了一番,很多人说道使用钩子,才能获得窗口外面的click事件,这也未免太小题大做了吧。

还好发现了一个简简单单的函数:

SetCapture(*this);

函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。

所以在创建窗口的时候,使用这个函数,就使得这个窗口可以获得窗口之外的鼠标click消息:

int cx = 500;
int cy = 800;
SetWindowPos(*this, NULL, x_position_, y_position_, cx, cy, SWP_FRAMECHANGED);
SetCapture(*this);

接下来的工作就简单了,就是获得鼠标点击的位置,使用GetCursorPos()函数:

函数功能:该函数检取光标的位置,以屏幕坐标表示。

函数原型:BOOL GetCursorPos(LPPOINT lpPoint);

参数:

IpPoint:POINT结构指针,该结构接收光标的屏幕坐标。

这样就可以在这个窗口的消息队列中进行判断了:

POINT click_point;
GetCursorPos(&click_point);
if (x_position_ + 500 > click_point.x && click_point.x > x_position_
    && y_position_ + 800 > click_point.y
    && click_point.y> y_position_)
    {
        MessageBox(NULL, "表情", L"没有表情", NULL);
    }
else
    {
        //delete 该窗口
    }
时间: 2024-12-14 10:48:18

没有躲过的坑--捕获窗口之外的鼠标消息(钩子还是??)的相关文章

没有躲过的坑--成对使用new和delete时要采取相同的形式

new创建类对象与不new区别: new创建类对象需要指针接收,一处初始化,多处使用 new创建类对象使用完需delete销毁 new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间 new对象指针用途广泛,比如作为函数返回值.函数参数等 而且每个学习C++编程的人都知道成对的使用new和delete,也也就是new申请的内存用delete释放,new []申请的内存由delete []释放. std::string* first_string = new std::string;

没有躲过的坑--指针(内存泄露)

C++被人骂娘最多的就是指针. 夜深人静的时候,拿出几个使用指针容易出现的坑儿.可能我的语言描述有些让人费劲,尽量用代码说话. 通过指向类的NULL指针调用类的成员函数 试图用一个null指针调用类的成员函数,导致崩溃: #include <iostream> using namespace std; class A { int value; public: void dumb() const {cout << "dumb()\n";} void set(int

SetCapture() &amp; ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP

今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE(移动),没了 WM_LBUTTONUP(松开) 百度了一下,找到解决方案:https://bbs.csdn.net/topics/390386415 网友@信阳毛尖: 一般在 WM_LBUTTONDOWN 消息的处理函数中设置焦点为当前窗口 SetCapture(m_hWnd)然后再 WM_LBUT

WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标当前相对于某个 WPF 控件的位置,也可以通过在 MouseMove 事件中通过 e.GetPosition(IInputElement relativeTo) 方法拿到同样的信息.不过,在任意时刻去获取鼠标位置的时候,如果鼠标在窗口之外,将获取到什么点呢? 本文将介绍鼠标在窗口之外时获取到的鼠标位

模态窗口其实就是在当前窗口调用系统的消息循环,响应用户的操作,将相关的消息发送到对应的窗口(转)

上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目.有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我自己的理解,有些是直接从网上copy的,有问题大家可以讨论. 1:GetMessage和PeekMessage的区别? GetMessage:获取消息队列中的一个消息,存入MSG中,并从消息队列中移除

窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND

WM_PAINTWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. WM_NCPAINT当窗口客户区以外的部分(如窗口标题栏.菜单栏等)需要需要重画时,系统向程序发出该消息.因标准窗口的客户区以外部分为窗口必需部分,因而该消息将默认被发送到DefWindowProc函数进行默认处理.程序可通过截获该消息来实现窗口其他部分的自定义绘制. WM_ERASEBKGND The WM_ERASEBKGND message is sent when t

非激活窗口中响应鼠标滚动之理论篇

在最近工作中有一个优化交互的需求,分析后得知,其核心功能为能在非激活窗口中响应鼠标滚动消息,先就该需求进行前期方案验证. 同类产品实现 参照现有软件行为,操作系统为Win7.以notepad++,Chrome两款软件为例. 当鼠标选中notepad++后,然后将鼠标转移到Chrome界面后,上下滚动鼠标,Chrome页面能够同步滚动. 当鼠标选中Chrome后,然后将鼠标转移到Notepad++界面,上下滚动,Notepad++不能同步滚动. 猜测是Chrome对滚轮滚动消息进行了额外处理.既然

没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)

最近被自己坑儿了一把,改别人的代码,最后编译器这样报错的: error C2653: not a class or namespace name 简单描述一下: 有一个类A,声明和实现分别位于 a.h和a.cc中 有一个类B,声明和实现分别位于 b.h和b.cc中 类A的某个成员函数需要B类类型作为参数 类B的某个成员函数需要A类类型作为参数 a.h文件如下: #ifndef A_H_ #define A_H_ #include "b.h" class A { public: enum

没有躲过的坑--你开发的软件安装在C盘Program Files (x86)下产生的异常

今天偶然发现的问题,就是自己写的win32程序安装在C盘Program Files (x86)文件夹下就会产生异常,而安装在其他文件夹,即使是D盘的Program Files (x86)下,程序也可以完美运行. 引起这个,肯定是权限的问题.这个软件运行时,需要读写数据库,以及各种缓存数据. 这就是我给自己挖的一个坑儿,相信很多人也会遇到这个问题. 就是在开发程序.VS调试的时候,总喜欢使用当前路径,或者是相对路径.即把一些数据与.exe文件放在一起. 但是安装的时候,选择的是C盘Program