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

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

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.

Я устала исправлять это, вызывая Курсор, но, кажется, это не вызвано. Есть ли способ отключить безопасность потоков, и это даже было бы хорошей идеей?

if (Cursor.Current.Handle.InvokeRequired) //and other variations of it
   this.Invoke(new MethodInvoker(() => this.Cursor = new cursor(Cursor.Current.Handle)));
else this.Cursor = new cursor(Cursor.Current.Handle);

Дайте ошибку

'IntPtr' does not contain a definition for 'InvokeRequired' and no accessible extension method 'InvokeRequired' accepting a first argument of type 'IntPtr' could be found (are you missing a using directive or an assembly reference?)

1 Ответ

1 голос
/ 24 октября 2019

Контекст принадлежит Form, а не курсору. Это означает, что вам нужно проверить на вызов в экземпляре формы. Но есть и другой вариант: захватить сам контекст синхронизации.

var f = new Form();
var ctx = WindowsFormsSynchronizationContext.Current;
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

Action a = () =>
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        f.Cursor = new Cursor(Cursor.Current.Handle);
    };


Task.Run(async () => {
    await Task.Delay(TimeSpan.FromSeconds(5));
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    ctx.Post(_ => a(), null);
});


Task.Run(async () =>
{
    await Task.Delay(TimeSpan.FromSeconds(10));
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
    if (f.InvokeRequired) f.Invoke(a); else a();
});

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