没有任何东西的SB_GETTEXT填充stringbuilder

时间:2014-03-08 03:23:14

标签: c# winapi stringbuilder

我正在尝试从另一个应用程序的状态栏的一部分获取文本。我可以把手柄搞定,我只是无法从我的stringbuilder中获取文本,当在消息框中显示时,它什么也没显示。

到目前为止

代码

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int message, int wParam,           [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int message, int wParam, int lParam);

IntPtr statbarhandle = IntPtr.Zero;
StringBuilder sbb = new StringBuilder(50);
StringBuilder classname = new StringBuilder(20);
classname.Append("msctls_statusbar32");
statbarhandle = FindWindowEx(gr3hwnd, IntPtr.Zero, classname, null);
int numofparts = SendMessage(statbarhandle, 0x406, 0, 0); 
SendMessage(statbarhandle, 0x402, 3, sbb);
MessageBox.Show(sbb.ToString());

SB_GETPARTS顺便说一下。 有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

这可能是因为你没有通过SB_GETTEXT

在标头文件中,SB_GETTEXT定义为(WM_USER+13)WM_USER定义为0x0400。因此,您应该在0x040d中传递SendMessage。您正在传递0x0402TB_CHECKBUTTON

请参阅http://www.pinvoke.net/default.aspx/user32/SB_GETTEXT.html处的常量定义。

这比那复杂一点。我现在看到SB_GETTEXTA(ANSI版本)是0x0402。 SB_GETTEXTW0x040d。你想要SB_GETTEXTW

答案 1 :(得分:1)

问题在于,对于此WM_USER消息,系统不执行文本的跨进程封送处理。您传递的指针是指向进程内存的指针。但是控件将其解释为地址空间中指向内存的指针。它不是。

您可以使用VirtualAlloc,ReadProcessMemory等来处理此问题,以便在目标进程中分配然后读取内存。更好的方法是使用UIAutomation来读取这些信息。