最近想要用JNA写一个后台自动运行的窗口,但是弄了很久,发送sendmassage,总是什么反应都没有,所以一狠心,直接将实际操作点击鼠标产生的信息,全部解读一遍,一边看msdn,一边解读,我只是个四级没过的英语渣,太难了。
~~o(>_<)o ~~
(*꒦⌓꒦)
首先看一下我们的图:
目录:
可以在这里查找对应行数
- 1行:S(发送数据):
- 2行:R(返回的数据):
- 3行:发送数据:WM_SETCURSOR:
- 4行:WM_SETCURSOR返回值:fHalt Processing:Ture
- 5行:WM_NCMOUSEMOVE(P)
- 6行:WM_PARENTNOTIFY(发送)
- 7行:WM_PARENTNOTIFY(R返回)
- 8行:WM_MOUSEACTIVATE(S)
- 9行:WM_MOUSEACTIVATE(R)
- 10行 :WM_WINDOWPOSCHANGING(S)
- 11行:WM_WINDOWPOSCHANGING(R)
- 12行:WM_WINDOWPOSCHANGED(S)
- 13行:WM_WINDOWPOSCHANGED(R)
- 14行:WM_ACTIVATEAPP(S)
- 15行:WM_ACTIVATEAPP(R)
- 16行:WM_NCACTIVATE(S)
- 17行:WM_NCACTIVATE(R)
- 18行:WM_ACTIVATE(S)
- 19行:WM_IME_NOTIFY(S)
- 20行:WM_IME_NOTIFY(R)
- 21行:WM_SETFOCUS(S)
- 22行:WM_SETFOCUS(R)
- 23行:WM_ATIVATE(R)
在这里解读之前首先讲一下简单基本概念,
<000001>表示行数
000D0724:表示窗口句柄
S:表示通过WindowsAPI的SendMessage发送的消息
P:表示postMessage发送消息
R:表示返回值(Return)
WM_NCHITTEST:表示消息信息,msg
消息缩写解读
WM:wm系统是Windows Mobile的缩写,是 Microsoft 用于 Pocket PC 和 Smartphone 的软件平台。
NC:nc的英文全称是nonclient,和client相对应
加nc的是指非客户区消息
IME:IME是指Input Method Editors输入法编辑器,当系统侦测到暂时无需使用输入法,或者程序不兼容Windows 8时,将自动提醒无法使用,且右下角显示已禁用IME。如果使用鼠标或触摸屏激活焦点时需要使用输入法时,系统则会自动启用IME输入法以便使用键盘输入。
NOTIFY:notify—通知
返回值解读:
对每一行的窗口进行解读,可能有些不太准,有问题可以在评论下提醒一下
f类:
fHalt----父类暂停
hwndToplevel:顶层句柄-----就是我们点击选中窗口句柄
nHit Test:HTCLIENT—>击中测试:在客户端
uMsg:附带消息指令
1行:S(发送数据):
具体解析:我们可以知道这个是移动鼠标中产生的,移动的鼠标,坐标(666,300)
2行:R(返回的数据):
返回的是HTRIGHT,查看msdn可以知道:
在可调整大小窗口的右边框中(用户可以单击鼠标以水平调整窗口大小)。
WM_SETCURSOR:如果鼠标导致光标在窗口内移动,并且没有捕获鼠标输入,则发送到窗口。
3行:发送数据:WM_SETCURSOR:
参数解析:
hwnd:000D0724,父类,顶层窗口的句柄
nHittest:HTRIGHT,光标在窗口的右边框
wMouseMsg:WM_MouseMove------鼠标移动
fuActive:父窗口激活
4行:WM_SETCURSOR返回值:fHalt Processing:Ture
轮英语的重要性:Halt:停止; 阻止; 暂停; 小火车站(只有站台);
所以我们可以知道这个窗口的信息怎么解析:
父类进程是否是暂停的?是(ture)
这个又是干嘛呢?WM_MOUSEMOVE为post消息。对于几乎所有的鼠标消息,如果mouse没有被捕获(capture),那么将被发送到包含光标的窗口,否则发送到捕获鼠标的窗口。只有前景窗口可以Capture鼠标。使用SetCapture捕获鼠标,且一个时刻只能有一个窗口Capture鼠标。
https://blog.csdn.net/redoc_li/article/details/1655857
=想法能不能一秒分成很多秒,执行的时候setCapture,之后一毫秒只有重新修改
5行:WM_NCMOUSEMOVE(P)
HitTest:命中测试–
所以这句话的意思是:左边框命中测试,坐标(X,Y)
注意:这里的p代表是postMessage进行发送不是sendMessage
6行:WM_PARENTNOTIFY(发送)
当子代窗口上发生重要操作时,发送到窗口。该消息现在被扩展到包括WM_POINTERDOWN事件。创建子窗口时,系统在创建窗口的CreateWindow或CreateWindowEx函数之前发送WM_PARENTNOTIFY。当子窗口被销毁时,系统在进行销毁该窗口的任何处理之前发送消息。
理解:子窗口发生一个重要事件,通知父窗口,在父窗口下发生事件:鼠标左键按下,坐标
7行:WM_PARENTNOTIFY(R返回)
8行:WM_MOUSEACTIVATE(S)
参数解析:
hwndToplevel:顶层句柄-----就是我们点击选中窗口句柄
nHit Test:HTCLIENT—>击中测试:在客户端
uMsg:WM_LBUTTONDOWN—>鼠标按下左键
9行:WM_MOUSEACTIVATE(R)
参数解析:
fuActive:MA_ACTIVATE—>>激活窗口,不丢弃鼠标消息。
10行 :WM_WINDOWPOSCHANGING(S)
发送到 Z order中的大小、位置或位置将因调用SetWindowPos函数或其他窗口管理函数而发生更改的窗口,也就是说将窗口的一些基本信息发送出去。
11行:WM_WINDOWPOSCHANGING(R)
12行:WM_WINDOWPOSCHANGED(S)
这个消息与上面的消息很像,但是看了一下mdsn发现的他们的解释基本都是不一样的,所以查一下的最后找到了这篇文章:
https://devblogs.microsoft.com/oldnewthing/20080116-00/?p=23803#:~:text=The%20WM_WINDOWPOSCHANGING%20message%20is%20sent%20early%20in%20the,the%20WM_WINDOWPOSCHANGING%20message%20and%20modifying%20the%20WINDOWPOS%20structure.
但是如果我们直接把这两个的消息翻译成为小写的haul,我们就很容易看出来了
wm_windowposchanging 和 wm_windowposchanged
wm_window pos changing 和 wm_window pos changed
一个正在进行时,一个过去式。
dddd;
所以他们附加的信息lpwp的值才会是一样的
13行:WM_WINDOWPOSCHANGED(R)
返回值,不解释了
14行:WM_ACTIVATEAPP(S)
WM_ACTIVATEAPP表示如果这个不是我们当前用的激活的窗口,那么,这个信息就会在被激活之前发送过去判断的
所以这个的意思是,这个窗口是不是已经被激活了,fwActive表示父类窗口已激活,==这个窗口已经被激活了
之后就停掉之前前线程窗口,在我们没有激活窗口之前的的线程
所以dwThreadID中d的意思应该是摧毁(destroy),摧毁当前执行的线程,到另外一个一个线程中去
不过线程id为000000:很可能是因为没有这个线程
15行:WM_ACTIVATEAPP(R)
16行:WM_NCACTIVATE(S)
表示是非聚焦的窗口激活
17行:WM_NCACTIVATE(R)
18行:WM_ACTIVATE(S)
fwActivate:WA_CLICKACTIVE------->通过鼠标点击激活。
fminimized-------表示父类是否是最小化,:false
hwndPreviouse:前一个句柄:null
19行:WM_IME_NOTIFY(S)
从缩写中可以看懂,Windows系统_键盘__通知
发送到应用程序,通知它对IME(键盘焦点)窗口的更改。
dwCommand:IMN_OPENSTATUSWINDOW------>小写:Imn_openStatusWindow-----》窗口开启状态
应用程序处理此命令以自行显示IME的状态窗口
20行:WM_IME_NOTIFY®
21行:WM_SETFOCUS(S)
hwndLosefocus:失去焦点的句柄为null
22行:WM_SETFOCUS®
23行:WM_ATIVATE(R)
窗口激活,对应第18行
最后看评论收藏,赞数更新
~( ̄▽ ̄~)(~ ̄▽ ̄)~