Как запустить фоновый поток, который должен получить доступ к пользовательскому интерфейсу - PullRequest
0 голосов
/ 13 февраля 2019

Я с нетерпением жду, чтобы добавить модуль проверки положения мыши в моей программе.Интерфейс пользователя имеет два Textbox для печати X и Y. Он должен печатать позицию курсора асинхронно.

Я пробовал с BeginInvoke / Invoke, Thread.isBackgroud = true, BackgroundWorker, но ни один из них не помог.

Thread / BackgroundWorker продолжает возникать

Ошибка перекрестного потока (как и ожидалось),

и BeginInvoke / Invoke имеет проблемы сasync: поток пользовательского интерфейса продолжает умирать.

Я также пробовал событие mousemove, это работает, но когда курсор выходит за границу формы, отслеживание положения останавливается.

delegate void MP();
private void tracktoggle() {
    MP mp = printMousePosition;
    BeginInvoke(mp); // Or Invoke(mp);
}

private void printMousePosition() {
    while(true) {
       this.Xtext.Text = Mouseposition.X.ToString();
       this.Ytext.Text = Mouseposition.Y.ToString();
    }
}

этот код покидает поток пользовательского интерфейсав блоке.

private async void tracktoggle() {
    Task T = new Task(() => { printMousePosition(); });
    await T;
}

private void printMousePosition() {
    while(true) {
       this.Xtext.Text = Mouseposition.X.ToString();
       this.Ytext.Text = Mouseposition.Y.ToString();
    }
}

это код с async / await.Не блокирует поток пользовательского интерфейса, но текстовые поля не обновляются.Я думал, что BeginInvoke был асинхронной версией Invoke :( не работает

Хотите асинхронно печатать положение мыши без блокировки потока пользовательского интерфейса.

1 Ответ

0 голосов
/ 15 февраля 2019

Я нашел, что лучшее решение - установить WindowsHook с user32.dll.

[DllImport("user32.dll", CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern int SetWindowsHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

///On the Code 14 is low level mouse hooking id
HookID = SetWindowsHookEx(14, MouseEventFunc, (IntPtr)0, 0/*should be 0, cause we are trying to make global hook);

private void int MouseEventFunc(int nCode, IntPtr w, IntPtr l) {
{
     this.MouseX.Text = MousePosition.X.ToString();
     this.MouseY.Text = MousePosition.Y.ToString();
     return CallNextHookEx(HookID, nCode, w, l);
}

этот фрагмент очень хорошо получает / обновляет TextBox.

У всех есть проблемы с этой проблемой, попробуйтеэто решение

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