aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 9627|回复: 11

窗口设置类名问题

[复制链接]

10

主题

16

回帖

180

积分

一级会员

积分
180
发表于 2018-3-30 16:04:58 | 显示全部楼层 |阅读模式

如图,我想指定窗口类名为class,可实际获取到的类名后面多了一个TID
请教,怎么更改,或去除后缀,谢谢

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-30 16:48:23 | 显示全部楼层
很多窗口类名后面都有这个,一定要去掉干什么呢?!
查找窗口用 winex.find 就可以用模式匹配了。

一定要自己指定类名,在创建窗口的时候指定 className属性就可以了,
你可以自己先注册一个类名,例子:
import win.ui;
win.registerClassEx(
"frmCustom",{
    hIcon = _HAPPICON;
    hIconSm = _HAPPICON;
    hCursor = ::LoadCursor(
null, topointer(0x7F00/*_IDC_ARROW*/) );
    hbrBackground =  
topointer(0xF/*_COLOR_3DFACE*/ + 1);
} );

/*DSG{{*/
var winform = win.form(text="aardio form";className="frmCustom";right=759;bottom=469)
/*}}*/

winform.show();
win.loopMessage();


10

主题

16

回帖

180

积分

一级会员

积分
180
 楼主| 发表于 2018-3-30 17:46:03 | 显示全部楼层
Jacen.He 发表于 2018-3-30 16:48
很多窗口类名后面都有这个,一定要去掉干什么呢?!
查找窗口用 winex.find 就可以用模式匹配了。

非常感谢,因为调用别人的dll 它查找窗口的方式通过指定类名来的!

10

主题

16

回帖

180

积分

一级会员

积分
180
 楼主| 发表于 2018-3-30 19:03:47 | 显示全部楼层
本帖最后由 261041951 于 2018-3-30 19:08 编辑
Jacen.He 发表于 2018-3-30 16:48
很多窗口类名后面都有这个,一定要去掉干什么呢?!
查找窗口用 winex.find 就可以用模式匹配了。

顺便问下,arr 怎么实现如下E代码的功能?
尝试了用raw.toString(),貌似不对,
求指点迷津,谢谢

  1. CallWindowProc (WndFunc, hWnd, uMsg, wParam, lParam)
  2. sByte = 指针到字节集 (lParam, 1024)          //@1 内存数据,@2 取出长度
  3. lpData = 取字节集数据 (sByte, #整数型, 9)         //@1 字节数据,@2 指定类型,@3 取指定数量
  4. Str = 指针到文本 (lpData)

复制代码

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-30 19:25:40 | 显示全部楼层
261041951 发表于 2018-3-30 19:03
顺便问下,arr 怎么实现如下E代码的功能?
尝试了用raw.toString(),貌似不对,
求指点迷津,谢谢
E代码除了你们,其他人一般是看不太明白的,
你可以直接用汉语描述一下你的问题,或者发一下其他语言的代码。
例如你是call别人的wndproc,还是别人发了什么消息什么指针给你........直接说具体问题比较好。

如果是将指针转换为字符串,用 raw.toString,或者 raw.str 都可以,
你遇到问题的话,请将可以重现问题的代码、错误信息发一下,这样才能知道你具体是遇到了什么问题。

9

主题

27

回帖

239

积分

二级会员

积分
239
发表于 2018-3-30 21:47:38 | 显示全部楼层
Jacen.He 发表于 2018-3-30 19:25
E代码除了你们,其他人一般是看不太明白的,
你可以直接用汉语描述一下你的问题,或者发一下其他语言的代 ...

Jacen 能否告知下他这图片这么发上去了。 他这也是一段没权限上传图片啊

10

主题

16

回帖

180

积分

一级会员

积分
180
 楼主| 发表于 2018-3-30 22:07:37 | 显示全部楼层
本帖最后由 261041951 于 2018-3-30 22:09 编辑
Jacen.He 发表于 2018-3-30 19:25
E代码除了你们,其他人一般是看不太明白的,
你可以直接用汉语描述一下你的问题,或者发一下其他语言的代 ...
  1. import win.ui;
  2. import console;
  3. import win.ui;
  4. //设置类名为 class
  5. win.registerClassEx("class",{
  6.     hIcon = _HAPPICON;
  7.     hIconSm = _HAPPICON;
  8.     hCursor = ::LoadCursor(null, topointer(0x7F00/*_IDC_ARROW*/) );
  9.     hbrBackground =  topointer(0xF/*_COLOR_3DFACE*/ + 1);
  10. } );
  11. /*DSG{{*/
  12. var mainForm = win.form(className="class";text="test";right=453;bottom=428;border="dialog frame")
  13. mainForm.add(
  14. edit={cls="edit";left=23;top=18;right=433;bottom=406;edge=1;multiline=1;vscroll=1;z=1}
  15. )
  16. /*}}*/




  17. var CallWindowProc = ::User32.api("CallWindowProcA","int(int lpPrevWndFunc,int hWnd, int msg,int wParam,INT lParam)");
  18. var SetWindowLong = ::User32.api("SetWindowLongA","int(int hWnd,int nIndex, INT dwNewLong)");
  19. var GetWindowLong = ::User32.api("GetWindowLongA","int(int hWnd,int nIndex)");
  20. import crypt.bin;

  21. function 调试输出(str1,str2,str3){
  22.     mainForm.edit.text=string.concat(str1,"        ",str2,"        ",str3)+'\r\n'+mainForm.edit.text
  23. }
  24. function funBk(hWnd,uMsg,wParam,lParam){
  25.         if(uMsg==74/*WM_COPYDATA*/){
  26.                  sByte=raw.convert(topointer(lParam))
  27.                   console.varDump(raw.str(sByte,true))
  28.                 Proc =0        
  29.         }else {
  30.                 Proc = CallWindowProc (OldProc, hWnd, uMsg, wParam, lParam)
  31.         }
  32.         return Proc;
  33. }

  34. mainForm.show()
  35. winHwnd=win.find(,"test")
  36. OldProc=GetWindowLong(winHwnd,-4)
  37. callBack=..raw.tostdcall(funBk,"int(int hWnd, int uMsg,int wParam, INT lParam)")
  38. SetWindowLong (winHwnd, -4, tonumber(callBack))


  39. 调试输出("类名",win.getClass(winHwnd))
  40. 调试输出(winHwnd,OldProc)
  41. 调试输出("Cb",tonumber(callBack))
复制代码
就是在收到消息后如何对lParam进行处理?

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-30 23:02:28 | 显示全部楼层
261041951 发表于 2018-3-30 22:07
就是在收到消息后如何对lParam进行处理?


如果你要得到窗口句柄,直接写 mainForm.hwnd 就可以。
不需要 winHwnd=win.find(,"test") 这么复杂

如果你要处理窗口消息,直接写消息回调就可以:
mainForm.wndproc = function(hwnd,message,wParam,lParam){
   
}

如果你想在文本框连续输出多个变量,
直接写 mainForm.edit.print(str1,str2,str3) 就可以


如果你想处理 WM_COPYDATA 消息接收内存数据,直接这样写就可以
mainForm.onCopyData = function(data){
   
}

不需要写的那么复杂的

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-30 23:07:10 | 显示全部楼层
如果窗口是别的DLL创建的,你要子类化,这样写就可以
win.subclass(
    hwnd,function (hwnd,message,wParam,lParam) {
        
    })
你可以右键点 win.subclass ,然后跳转到定义,看看这些库函数是怎么写

10

主题

16

回帖

180

积分

一级会员

积分
180
 楼主| 发表于 2018-3-31 00:17:43 | 显示全部楼层
本帖最后由 261041951 于 2018-3-31 00:19 编辑
Jacen.He 发表于 2018-3-30 23:07
如果窗口是别的DLL创建的,你要子类化,这样写就可以你可以右键点 win.subclass ,然后跳转到定义,看看这 ...

学习了,子类化 原来有封装好的,
  1. win.subclass(
  2.     winHwnd,function (hwnd,message,wParam,lParam) {
  3.     if(message==74){
  4.                 sByte=raw.convert(topointer(lParam),{BYTE b[1024]} )
  5.                
  6.     }
  7. })
复制代码
那我接收到窗口消息,怎么处理才能输出字符串呢
他这个E我真没看懂。想用arr写出来
  1. sByte = 指针到字节集 (lParam, 1024)
  2. lpData = 取字节集数据 (sByte, #整数型, 9) //得到内存指针 #整数型=3
复制代码


166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-31 01:02:37 | 显示全部楼层
261041951 发表于 2018-3-31 00:17
学习了,子类化 原来有封装好的,
那我接收到窗口消息,怎么处理才能输出字符串呢
他这个E我真没看懂。 ...

WM_COPYDATA 传过来的不是字符串,也不是字节数组,而是一个结构体,这样转换lParam为结构体:
var data = raw.convert( topointer(lParam) ,{
    ADDR dwData;
    INT cbData;
    pointer lpData
})

然后将data.cbData转换为字符串
str = raw.tostring(s,1,data.cbData)

这些东西属于基础语法知识,你还是先去看一下帮助文档吧.

如果你是使用 aardio 创建的窗口,直接用onCopyData 就可以了,这个事件里已经全部处理好了,参数就是字符串
mainForm.onCopyData = function(data){

}




166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2018-3-31 04:01:15 | 显示全部楼层
如果不想用 mainForm.onCopyData,
我刚才增加了一个新的函数 win.getCopyData(lParam) 一句代码解决问题。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-15 06:26 , Processed in 0.057934 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表