想知道,使用API GetWindowText 与SPY++ 里输出的 Caption值的区别

时间:2022-09-07 21:12:26
今天看到一个界面,上边有一Button,用Spy++抓,正常的显示出 ClassName与Caption,然后我通过API"GetClassName"去获取ClassName值,与SPY++显示的一致,

通过API"GetWindowText"获取Caption值,结果为空,与SPY++能显示出来的值不一致!!!

我的问题是: 想知道为什么,和怎么做才能和SPY++一样能读取Caption值出来~

上网也看了一下SPY++读取Caption的相关原理资料,里边说是SPY++是通过HOOK textout 的方式获取此值,是否真的这样(正在试验中)?




各位大侠有什么好方法能方便点与SPY++一样正确的读出Caption值?? 谢谢! (因为有点急,所以一边发贴看看大家的招术,另一边在试..)

9 个解决方案

#1


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


            StringBuilder s=new StringBuilder(256);
          int ii=  GetWindowText(this.Handle, s, 256);
          MessageBox.Show(s.ToString());


应该是你的声明有问题导致调用失败。

#2


同ls,八成是调用失败.

#3


先感谢下楼上,然后使用API"GetWindowText"与SPY++输出的不一样,大多数是一样,但我遇到的这个却是不一样,我还是想知道原因,刚刚这样试了一下,结果获取出来的值与Spy++的一样了~~

看来SPY++获取的是TEXT属性的值而不是CAPTION属性的值啊??

  string w = "";
  IntPtr ptr = Marshal.StringToHGlobalAnsi(w);
  if (SendMessage((IntPtr)136316, WinApi.WM_GETTEXT, 100, ptr))
  {
    var dd = Marshal.PtrToStringAnsi(ptr);
  }

#4


哎,自己想了半天没弄想明白,一发贴问了才突然才想到可以试读取TEXT属性值,一试果然能正常读出来了

#5


现在的问题就剩下使用SPY++显示CAPTION属于值是否真的等于 text 值而不是 caption值? 

#6


GetWindowText不能跨进程获得子控件的text,只能获得主窗口的Text.
WM_GETTEXT不受进程控制。
同一个进程内GetWindowText和WM_GETTEXT效果相同。

#7


http://msdn.microsoft.com/zh-cn/library/ms633520(v=VS.85).aspx

http://baike.baidu.com/view/1080327.html?fromTaglist
 如果目标窗口属于当前进程,GetWindowText函数给指定的窗口或控件发送WM_GETTEXT消息。如果目标窗口属于其他进程,并且有一个窗口标题,则GetWindowTeXt返回窗口的标题文本,如果窗口无标题,则函数返回空字符串。

#8


SPY++,是通过入侵dll.来达到以上功能的。
在c++中用loadlibrary("dll名称")
openProcess()
getWindowsThreadProcessID()
等函数完成的。

http://bbs.eyuyan.com/dispbbs.asp?boardid=124&Id=156115

#9


引用 1 楼 xingyuebuyu 的回复:
C# code
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


            S……

#1


        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


            StringBuilder s=new StringBuilder(256);
          int ii=  GetWindowText(this.Handle, s, 256);
          MessageBox.Show(s.ToString());


应该是你的声明有问题导致调用失败。

#2


同ls,八成是调用失败.

#3


先感谢下楼上,然后使用API"GetWindowText"与SPY++输出的不一样,大多数是一样,但我遇到的这个却是不一样,我还是想知道原因,刚刚这样试了一下,结果获取出来的值与Spy++的一样了~~

看来SPY++获取的是TEXT属性的值而不是CAPTION属性的值啊??

  string w = "";
  IntPtr ptr = Marshal.StringToHGlobalAnsi(w);
  if (SendMessage((IntPtr)136316, WinApi.WM_GETTEXT, 100, ptr))
  {
    var dd = Marshal.PtrToStringAnsi(ptr);
  }

#4


哎,自己想了半天没弄想明白,一发贴问了才突然才想到可以试读取TEXT属性值,一试果然能正常读出来了

#5


现在的问题就剩下使用SPY++显示CAPTION属于值是否真的等于 text 值而不是 caption值? 

#6


GetWindowText不能跨进程获得子控件的text,只能获得主窗口的Text.
WM_GETTEXT不受进程控制。
同一个进程内GetWindowText和WM_GETTEXT效果相同。

#7


http://msdn.microsoft.com/zh-cn/library/ms633520(v=VS.85).aspx

http://baike.baidu.com/view/1080327.html?fromTaglist
 如果目标窗口属于当前进程,GetWindowText函数给指定的窗口或控件发送WM_GETTEXT消息。如果目标窗口属于其他进程,并且有一个窗口标题,则GetWindowTeXt返回窗口的标题文本,如果窗口无标题,则函数返回空字符串。

#8


SPY++,是通过入侵dll.来达到以上功能的。
在c++中用loadlibrary("dll名称")
openProcess()
getWindowsThreadProcessID()
等函数完成的。

http://bbs.eyuyan.com/dispbbs.asp?boardid=124&Id=156115

#9


引用 1 楼 xingyuebuyu 的回复:
C# code
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);


            S……