我想获取应用程序的控件/句柄的内容..
这是实验代码..
Process[] processes = Process.GetProcessesByName("Notepad");
foreach (Process p in processes)
{
StringBuilder sb = new StringBuilder();
IntPtr pFoundWindow = p.MainWindowHandle;
List <IntPtr> s = GetChildWindows(pFoundWindow);
// function that returns a
//list of handle from child component on a given application.
foreach (IntPtr test in s)
{
// Now I want something here that will return/show
the text on the notepad..
}
GetWindowText(pFoundWindow, sb,256);
MessageBox.Show(sb.ToString()); // this shows the title.. no problem with that
}
任何想法? 我已经阅读了一些API方法,如GetWindowText或WM_GETTEXT,但我不知道如何使用它或将其应用于我的代码.. 我需要一个教程或示例代码......
提前致谢:)
答案 0 :(得分:17)
public class GetTextTestClass{
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SendMessage(int hWnd, int Msg, int wparam, int lparam);
const int WM_GETTEXT = 0x000D;
const int WM_GETTEXTLENGTH = 0x000E;
public string GetControlText(IntPtr hWnd){
// Get the size of the string required to hold the window title (including trailing null.)
Int32 titleSize = SendMessage((int)hWnd, WM_GETTEXTLENGTH, 0, 0).ToInt32();
// If titleSize is 0, there is no title so return an empty string (or null)
if (titleSize == 0)
return String.Empty;
StringBuilder title = new StringBuilder(titleSize + 1);
SendMessage(hWnd, (int)WM_GETTEXT, title.Capacity, title);
return title.ToString();
}
}
答案 1 :(得分:3)
GetWindowText不会向您提供其他应用程序编辑窗口的内容 - it only supports default-managed text [如标签的标题]跨进程以防止挂起...您必须发送WM_GETTEXT。
您需要使用StringBuilder版本的SendMessage:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam);
const int WM_GETTEXT = 0xD;
StringBuilder sb = new StringBuilder(65535);
// needs to be big enough for the whole text
SendMessage(hWnd_of_Notepad_Editor, WM_GETTEXT, sb.Length, sb);
答案 2 :(得分:2)
查看http://pinvoke.net/default.aspx/user32/GetWindowText.html以及MSDN上的文档。下面是一个如何使用GetWindowText方法的简短代码示例。