AHKpostmessage的使用方法/参数查询/win32API

Posted LAM LAB

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AHKpostmessage的使用方法/参数查询/win32API相关的知识,希望对你有一定的参考价值。

AHK中有两个命令一直都没搞明白它们的使用方法——PostMessage和SendMessage,百度的结果真的隐晦,还有说要对win32API熟悉才行,害我又去查win32API的列表找这类书籍的pdf,越查越糊涂。
现在终于都知道怎么查找了这些所谓的Message上的十六位数字是什么意思了,以及他们的参数怎么去查询
总结:这种东西还是得回去看手册,但是嘛,开始也是知道这个道理的,但是在search上怎么找都是只有PostMessage的函数解释,偶尔机会又翻看了一次又发现一些东西,特意记下来,帮助像我当初忙头苍蝇的业余选手到处撞,不需要对win32API特别熟悉也能用。
解决方法:首先理解两个函数参数放的啥玩意,然后关键是把窗口句柄,以及菜单句柄给获取到,这里就牵涉到或许这些句柄的工具了,很多介绍都不管用,光这一步都阻碍了很久,好不容易找到句柄工具了,但是不会用也是要命,离PostMessage的实现只差一步之遥,也就是winspy类软件的使用方法,本文用的是它windows detective,对比发现也只有它能用。

首先,一段代码为例子,需求是在q-dir上添加额外的快捷键,但是WinMenuSelectItem这个菜单函数调用不了,然后注释的代码是我原先的解决方案,会跟软件自带的软件冲突,所有还是得PostMessage
然后,PostMessage函数,个人习惯配合#IfWinActive 一起使用,所以参数上就只含有两个,也就是命令的类型执行的命令(也就是句柄),常规的话还是有很多参数在后面跟着的,具体的话可以查手册,这里只需要用到前两个就够了。

#IfWinActive ahk_exe q-dir.exe

^+n:: ;新建文件夹
;send !vwf
PostMessage, 0x0111, 5034
return

^+t:: ;新建记事本
;send !vwt
PostMessage, 0x0111, 5048
return

^+s:: ;新建快捷方式
;send !vws
PostMessage, 0x0111, 5035
return

#IfWinActive

查询句柄的工具

这里是最大的关卡,因为业余一直找不到正确的开启办法

图片上的很多都是绿色版,不知道为什么就是用不了,没有一个能打!! 然后无意间发现个windows detective客户端,终于等到了!!

打开之后首先捕捉一个窗口

然后打开message,

打开过滤器 exclude全部只留下wm_command ,然后就去q-dir.exe软件通过菜单执行新建文件夹或自己想实现的操作

然后回去看message就可以看到,注意,定位一定要准确,定位到菜单栏,否则message会没东西的

设置快捷键

然后就可以配合postmessage生成相应快捷键了,就像开头解释的那样了

附:0x0111的类型是 WM_COMMAND,点击菜单, 点击子窗口按钮。也就是功能就是专门点击菜单用
而下面这个0x0112则是 WM_SYSCOMMAND 点击窗口标题栏右键菜单

例如:

官方API介绍

小结

关于命令类型,可以从下面的消息列表查看,确实挺多的,真学无止境,要想实现其他非点击菜单的命令,确实得熟悉才行。。。
功能基本够用就行,多也记不住,折腾不来
也不怪得找不到什么教程,试了一圈,记事本和资源管理器的句柄都捕获不了,也就只有Q-dir可以,其他程序更是只显示只要一个窗体,连菜单句柄都没有。一个词总结就是,难用!!! 新版本窗体控件开发的都抓不,就是个WinMenuSelectItem的替代品,而且都是淘汰产品。

参考

因为关注点在sendmessage的函数方法的使用上,而没有发现两个

sendmessage的使用方法

windows消息列表

WinMenuSelectItem的函数,这个除了记事本其他程序都没成功过。

sendmessage/postmessage函数

官方win32API介绍 ——wm-syscommand

课后作业

照着AHK给的例子写了几个,还看了官方API扩展了些
业余的应该也就能实现这些了,不然给的例子也不会那么普通



#1:: ;改标题,操作窗体 0x000C is WM_SETTEXT
SendMessage, 0x000C, 0, "New Title" 
return


#2:: ;有些窗体操作需要配合其他函数 WM_VSCROLL := 0x0115
ControlGetFocus, control, A ;上滑
SendMessage, 0x0115	, 0, 0, %control%, A
return

#3:: ;水平右滑
ControlGetFocus, control, A ;窗体 WM_HSCROLL := 0x0114
SendMessage, 0x0114, 1, 0, %control%, A
return

#4:: 下滑;
ControlGetFocus, control, A 
SendMessage, 0x0115, 1, 0, %control%, A
return

#5:: ;关闭窗口
SendMessage, 0x0010
return

;#e:: ;这个是win消息列表 移动窗体,可能得结合相关参数
;SendMessage, 0x0003 ;并不能直接用
;return

#e:: ;换了种方式 通过system command指令 WM_SYSCOMMAND := 0x0112
PostMessage, 0x0112,0xF010 ;通过WM_SYSCOMMAND的官网API查到 SC_MOVE 0xF010
return
#e:: ;换了种方式 换成十进制一样是可以的
PostMessage, 0x0112,61456 

;在窗口句柄捕捉工具摸索不了什么,因为都唔说明函数,且每种命令类型的用法不一样
;然后利用 举一反三,鉴于自己IDE知识水平,实现的功能有限,
;可以说只有点击菜单栏有用,其他都不如直接用快捷键组合更好理解和修改


graphql 在嵌套查询的父或父参数上使用嵌套查询参数

【中文标题】graphql 在嵌套查询的父或父参数上使用嵌套查询参数【英文标题】:graphql using nested query arguments on parent or parent arguments on nested query 【发布时间】:2019-05-08 23:56:29 【问题描述】:

我有一个产品和项目

产品:


  id: Int
  style_id: Int
  items: [items]

项目:


  id: Int
  product_id: Int
  size: String

我想查询产品,但只取回具有尺寸的产品。

所以查询可能如下所示:

products(size: ["S","M"]) 
  id
  style_id
  items(size: ["S","M"]) 
    id
    size
  

但似乎应该有一种我可以做到的方法

products 
  id
  style_id
  items(size: ["S","M"]) 
    id
    size
  

在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,添加检查以仅退回具有这些尺寸的产品。这样我就可以正确返回***页面,而不是很多空产品。

这是否可能或至少反过来:

products(size: ["S","M"]) 
  id
  style_id
  items 
    id
    size
  

然后将 size 参数发送到项目解析器?我知道的唯一方法是通过上下文,但我发现的一个地方他们说这不是一个好主意,因为上下文跨越了所有深度的完整查询。

【问题讨论】:

尝试“项目:[项目!]!”在产品架构中。 GraphQL 本身并不支持您的要求;如果你想过滤你得到的***项目,它需要由***查询字段上的参数控制,而不是更低的。 @DavidMaze 这是不正确的。看我的回答。 【参考方案1】:

我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,它只表示具有项目的产品。

但是,如果您不想这样做,或者您只是对***选择器如何了解子选择器上的参数感兴趣,可以使用以下方法:

有两种方法。


为此:

products 
  id
  style_id
  items(size: ["S","M"]) 
    id
    size
  

在 graphql 中,解析器具有以下签名:

(obj, args, context, info) => 

第 4 个参数 info 包含有关整个请求的信息。也就是说,它知道子选择器上的参数。

使用此包或类似的包,因为还有其他包,为您解析信息:https://www.npmjs.com/package/graphql-parse-resolve-info


上面的工作量很大,所以如果你想这样做:

products(size: ["S","M"]) 
  id
  style_id
  items 
    id
    size
  

然后在products 的解析器中,您还需要返回size。 假设这是products 的解析器:

(parent, args) => 
  ...
  return 
    id: '',
    style_id: ''
  

修改你的解析器也返回这样的大小:

(parent, args) => 
  ...
  return 
    id: '',
    style_id: '',
    size: ["S", "M"]
  

现在,在您对products.items 的解析中,您将可以访问size,如下所示:

(product, args) => 
  const size = product.size

【讨论】:

没有意识到您可以返回未在返回对象中设置的字段并将它们放在孩子身上。这是完全合理的,也是我将要去做的事情。 info 解决方案很酷! IMO 第二个有点奇怪,但它应该也可以工作!【参考方案2】:

IMO 你应该有一个ProductFilterInputType,它由GraphQLList(GraphQLString) 表示,这个解析器会根据这个列表过滤products

import  GraphQLList, GraphQLString  from 'graphql';

const ProductFilterInputType = new GraphQLInputObjectType(
  name: 'ProductFilter',
  fields: () => (
    size: 
      type: GraphQLList(GraphQLString),
      description: 'list of sizes',
    
  ),
);

希望对你有帮助:)

【讨论】:

【参考方案3】:

我发现这很有用#reference

//the typedef:

type Post 
    _id: String
    title: String
    private: Boolean
    author(username: String): Author

//the resolver:
Post: 
        author(post, username)
        //response
      ,
    
// usage

    posts(private: true)
    _id,
    title,
    author(username: "theara")
      _id,
      username
    
  

【讨论】:

以上是关于AHKpostmessage的使用方法/参数查询/win32API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用参数化查询提高Cypher查询的性能

为啥我不能在 Access 参数查询中使用字段名称作为参数?

何时使用查询参数与矩阵参数?

使用查询参数过滤结果

SQL:使用in作查询的时候查询参数的类型还可以不一样呢?

NHibernate - 如何使用参数值记录命名参数化查询?