/// <summary>
/// Copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a
/// control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another
/// application.
/// <para>
/// Go to https://msdn.microsoft.com/en-us/library/windows/desktop/ms633520%28v=vs.85%29.aspx for more
/// information
/// </para>
/// </summary>
/// <param name="hWnd">
/// C++ ( hWnd [in]. Type: HWND )<br />A <see cref="IntPtr" /> handle to the window or control containing the text.
/// </param>
/// <param name="lpString">
/// C++ ( lpString [out]. Type: LPTSTR )<br />The <see cref="StringBuilder" /> buffer that will receive the text. If
/// the string is as long or longer than the buffer, the string is truncated and terminated with a null character.
/// </param>
/// <param name="nMaxCount">
/// C++ ( nMaxCount [in]. Type: int )<br /> Should be equivalent to
/// <see cref="StringBuilder.Length" /> after call returns. The <see cref="int" /> maximum number of characters to copy
/// to the buffer, including the null character. If the text exceeds this limit, it is truncated.
/// </param>
/// <returns>
/// If the function succeeds, the return value is the length, in characters, of the copied string, not including
/// the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window
/// or control handle is invalid, the return value is zero. To get extended error information, call GetLastError.<br />
/// This function cannot retrieve the text of an edit control in another application.
/// </returns>
/// <remarks>
/// If the target window is owned by the current process, GetWindowText causes a WM_GETTEXT message to be sent to the
/// specified window or control. If the target window is owned by another process and has a caption, GetWindowText
/// retrieves the window caption text. If the window does not have a caption, the return value is a null string. This
/// behavior is by design. It allows applications to call GetWindowText without becoming unresponsive if the process
/// that owns the target window is not responding. However, if the target window is not responding and it belongs to
/// the calling application, GetWindowText will cause the calling application to become unresponsive. To retrieve the
/// text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.<br />For
/// an example go to
/// <see cref="!:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928%28v=vs.85%29.aspx#sending">
/// Sending a
/// Message.
/// </see>
/// </remarks>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
<DllImport("user32.dll", EntryPoint:="GetWindowText")>
Public Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
End Function
[<DllImport("user32", CharSet=CharSet.Auto)>]
extern IntPtr GetWindowText(IntPtr hwnd, StringBuilder lpString, int maxCount)
[DllImport("user32.dll", CharSet := CharSet.Auto, SetLastError := true)]
class method GetWindowText(hWnd: IntPtr; lpString: StringBuilder; nMaxCount: Int32): Int32; external;
Public Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal prmstrString As String, _
ByVal nMaxCount As Long) As Long
None.
See also GetWindowTextLength
Please add some!
public static string GetText(IntPtr hWnd)
{
// Allocate correct string length first
int length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}
But, if you need to get text from a control in another process, GetWindowText() won't work. Use WM_GETTEXT instead.
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, [Out] StringBuilder lParam);
public static string GetWindowTextRaw(IntPtr hwnd)
{
// Allocate correct string length first
int length = (int)SendMessage(hwnd, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
StringBuilder sb = new StringBuilder(length + 1);
SendMessage(hwnd, WM_GETTEXT, (IntPtr)sb.Capacity, sb);
return sb.ToString();
}
vb.net sample
Public Function GetText(ByVal hWnd As IntPtr) As String
Dim length As Integer
If hWnd.ToInt32 = 0 Then
Return Nothing
End If
length = GetWindowTextLength(hWnd)
If length = 0 Then
Return Nothing
End If
Dim sb As New System.Text.StringBuilder("", length)
GetWindowText(hWnd, sb, sb.Capacity + 1)
Return sb.ToString()
End Function
The ManagedWindowsApi project (http://mwinapi.sourceforge.net) provides a
class ManagedWinapi.SystemWindow that has a Title property.