跳跃我将如何在我的主程序中找到窗口处理...
在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设置为空。间谍++告诉我孩子的标题有价值。
答案 0 :(得分:4)
GetWindowText function documentation明确指出“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();
答案 1 :(得分:3)
“最正确”的方法是:
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方法暴露给外部世界(非公开)。