GetFocus - помощь Win32api - PullRequest
       3

GetFocus - помощь Win32api

2 голосов
/ 01 июля 2011

Я пытаюсь получить выделенный текст из открытой формы на компьютере пользователя.В настоящее время я пытался использовать GetFocus, который определен как

    '[DllImport("user32.dll")]
    static extern int GetFocus();'

В API это говорит - Retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue. Что объясняет, почему мое приложение может получить выделенный текст из окна, которое является частью моего приложения, ноне тот, который является внешним, как, например, pdf.

Какой альтернативный метод win32 доступен для меня, чтобы использовать его для этой цели?

Спасибо.

редактировать: этов данный момент это попытка

[DllImport ("user32.dll")] static extern int GetFocus ();

[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();

[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);

[DllImport("user32.dll")]
static extern int GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam);


// second overload of SendMessage

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);

const int WM_SETTEXT = 12;
const int WM_GETTEXT = 13;

private static string PerformCopy()
{
    try
    {
        //Wait 5 seconds to give us a chance to give focus to some edit window,
        //notepad for example
        System.Threading.Thread.Sleep(1000);
        StringBuilder builder = new StringBuilder(500);

        int foregroundWindowHandle = GetForegroundWindow();
        uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
        uint currentThreadId = GetCurrentThreadId();

        //AttachTrheadInput is needed so we can get the handle of a focused window in another app
        AttachThreadInput(remoteThreadId, currentThreadId, true);
        //Get the handle of a focused window


        int focused = GetFocus();




        //Now detach since we got the focused handle
        AttachThreadInput(remoteThreadId, currentThreadId, false);

        //Get the text from the active window into the stringbuilder
        SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);

        return builder.ToString();
    }
    catch (System.Exception oException)
    {
        throw oException;
    }
}

Ответы [ 3 ]

0 голосов
/ 01 июля 2011

Я не думаю, что у вас есть много шансов на успех с вашим текущим подходом. Я почти уверен, что нет единого API общего назначения для получения текущего выбора. Я верю в это, потому что каждое приложение может осуществлять выделение текста по-своему.

В качестве альтернативного решения вы должны рассмотреть возможность использования слушателя буфера обмена . Прислушивайтесь к изменениям содержимого буфера обмена, и всякий раз, когда добавляется текст, вы можете высосать его из буфера обмена и поместить в окно вашего приложения.

0 голосов
/ 02 июля 2011

Я думаю, что это работа для автоматизации пользовательского интерфейса (использование программ чтения с экрана API).Вот сообщение, которое получает выделенный текст в C # .

0 голосов
/ 01 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...