невозможно прочитать заголовок другого приложения - PullRequest
1 голос
/ 05 января 2011

Прыжки, как я найду дескриптор окна в моей основной программе ...

в 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 в ничто.шпион ++ сказал мне, что заголовок ребенка имеет значение.

Ответы [ 2 ]

4 голосов
/ 05 января 2011

В документации по функции 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();
3 голосов
/ 05 января 2011

«Самый правильный» способ сделать это будет:

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 внешнему миру (не публичному).

...