할 수있는 "가장 올바른"방법 :
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 메소드를 외부 세계 (공개되지 않음)에 노출 시켜서는 안됩니다.
파일 메뉴 옵션에서 상태 표시 줄 또는 그 사이의 모든 항목까지 다양합니다. –
나는 텍스트 영역에 뭔가를 썼다. 그런 다음 spy ++를 사용하여 캡션의 텍스트가있는 핸들을 찾은 다음 해당 코드에서 해당 핸들을 사용하십시오. –
당신은 핸들 ('hWnd')이 항상 같지 않다는 것을 알고 있습니까? 응용 프로그램에서 값을 하드 코딩하면 쓸모가 없습니다. –