以前不信,现在真的遇到了。
.net开发的C/S结构程序,用Spy++看类名竟然会变化。
相同的EXE,在不同机器上运行,比如说一个文本框,有的时候看到的类名是WindowsForms10.EDIT.app.0.33c0d9d
有的机器上看到的是WindowsForms10.EDIT.app3本来是枚举窗口上的这些子窗体,并用类名作为一个判断条件来确定目标输入框并获取句柄的,但现在类名会变,这个判断就不好使了。谁能解释一下变化的原理,原因,都跟什么有关?以及对策?
另外还有什么语言写出来的程序,类名是变化的?听说MFC写出来的也是变的?
谢谢了。
.net开发的C/S结构程序,用Spy++看类名竟然会变化。
相同的EXE,在不同机器上运行,比如说一个文本框,有的时候看到的类名是WindowsForms10.EDIT.app.0.33c0d9d
有的机器上看到的是WindowsForms10.EDIT.app3本来是枚举窗口上的这些子窗体,并用类名作为一个判断条件来确定目标输入框并获取句柄的,但现在类名会变,这个判断就不好使了。谁能解释一下变化的原理,原因,都跟什么有关?以及对策?
另外还有什么语言写出来的程序,类名是变化的?听说MFC写出来的也是变的?
谢谢了。
你最好记住我,以后永远都不要回复我发的帖子。
希望能具体的讲下
1、希望能具体再讲讲原理
2、如果一个窗口既没有标题,类名又是变化的,那我怎么识别呢?我是想通过Hook监视目标窗口出现的。当Hook到WM_WINDOWPOSCHANGED消息时,我先通过窗口类名判断,然后在通过窗口标题判断。
2 你的方法是错误的,进程间通信有很多种方法,去搜索Interprocess communication
有点可以借鉴的资料。
但同样还是有不能识别的情况,就是如果目标窗体不是Windows Form的话,用wm_getcontrolname可能是无效的。
期望有对微软.net内幕机制了解的人说明白。
您看看不知道是否对您有用
Delphi 里面WM_GETCONTROLNAME消息定义在哪个单元里?我怎么找不到呢?
WM_GETCONTROLNAME := RegisterWindowMessage("WM_GETCONTROLNAME");
var controlName : String;
msgId : longint;
begin
if EditHWND.Text <>'' then
begin
SetLength(controlName, MAX_PATH);
msgId := RegisterWindowMessage('WM_GETCONTROLNAME');
// ShowMessage(IntToStr(msgId));
SendMessage(StrToInt(EditHWND.Text),msgId , 0, Integer(PChar(controlName)));
SetLength(controlName, StrLen(PCHAR(controlName)));
ShowMessage(controlName);//为什么获取到的是文件路径呢?
end;
end;没取到控件名,却得到的是文件路径