无法阅读其他应用程序的标题

跳跃我将如何在我的主程序中找到窗口句柄…

在C#中

我运行notepad.exe然后在其中键入内容,然后使用SPY ++(0x111111)找到主窗口句柄,并且

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

这段代码工作正常,并返回主窗口的标题。

::但是当我做同样的事情来找到notepad.exe的孩子的标题时,它只是将str设置为空。 间谍++告诉我孩子的标题有价值。

“最正确”的方法是:

 public static string GetWindowText(IntPtr hwnd) { if (hwnd == IntPtr.Zero) throw new ArgumentNullException("hwnd"); int length = SendMessageGetTextLength(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero); if (length > 0 && length < int.MaxValue) { length++; // room for EOS terminator StringBuilder sb = new StringBuilder(length); SendMessageGetText(hwnd, WM_GETTEXT, (IntPtr)sb.Capacity, sb); return sb.ToString(); } return String.Empty; } const int WM_GETTEXT = 0x000D; const int WM_GETTEXTLENGTH = 0x000E; [DllImport("User32.dll", EntryPoint = "SendMessage")] extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport("User32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] extern static IntPtr SendMessageGetText(IntPtr hWnd, int msg, IntPtr wParam, [Out] StringBuilder lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, [In] string lpClassName, [In] string lpWindowName); 

请注意使用[In][Out]属性来消除编组期间不必要的复制。

另请注意,您永远不应将p / invoke方法暴露给外部世界(不公开)。

GetWindowText函数文档清楚地指出“GetWindowText无法检索另一个应用程序中的控件文本。…要在另一个进程中检索控件的文本,请直接发送WM_GETTEXT消息,而不是调用GetWindowText。”

您可以使用以下代码检索控件的文本:

 [DllImport("user32.dll", EntryPoint = "SendMessage")] public static extern IntPtr SendMessageGetText(IntPtr hWnd, uint msg, UIntPtr wParam, StringBuilder lParam); const uint WM_GETTEXT = 13; const int bufferSize = 1000; // adjust as necessary StringBuilder sb = new StringBuilder(bufferSize); SendMessageGetText(hWnd, WM_GETTEXT, new UIntPtr(bufferSize), sb); string controlText = sb.ToString();