通过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);
}
看来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效果相同。
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返回窗口的标题文本,如果窗口无标题,则函数返回空字符串。
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
在c++中用loadlibrary("dll名称")
openProcess()
getWindowsThreadProcessID()
等函数完成的。
http://bbs.eyuyan.com/dispbbs.asp?boardid=124&Id=156115
#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);
}
看来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效果相同。
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返回窗口的标题文本,如果窗口无标题,则函数返回空字符串。
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
在c++中用loadlibrary("dll名称")
openProcess()
getWindowsThreadProcessID()
等函数完成的。
http://bbs.eyuyan.com/dispbbs.asp?boardid=124&Id=156115
#9
顶