我正在尝试从另一个应用程序的状态栏的一部分获取文本。我可以把手柄搞定,我只是无法从我的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顺便说一下。 有人能帮助我吗?
答案 0 :(得分:1)
这可能是因为你没有通过SB_GETTEXT
。
在标头文件中,SB_GETTEXT
定义为(WM_USER+13)
,WM_USER
定义为0x0400
。因此,您应该在0x040d
中传递SendMessage
。您正在传递0x0402
,TB_CHECKBUTTON
。
请参阅http://www.pinvoke.net/default.aspx/user32/SB_GETTEXT.html处的常量定义。
这比那复杂一点。我现在看到SB_GETTEXTA
(ANSI版本)是0x0402。 SB_GETTEXTW
是0x040d
。你想要SB_GETTEXTW
。
答案 1 :(得分:1)
问题在于,对于此WM_USER
消息,系统不执行文本的跨进程封送处理。您传递的指针是指向进程内存的指针。但是控件将其解释为地址空间中指向内存的指针。它不是。
您可以使用VirtualAlloc,ReadProcessMemory等来处理此问题,以便在目标进程中分配然后读取内存。更好的方法是使用UIAutomation来读取这些信息。