Winforms / ActiveX перекрестные вызовы - PullRequest
1 голос
/ 12 июля 2010

У меня есть приложение, в котором я размещаю несколько типов контента (изображения, презентации PowerPoint, видео и т. Д.) В приложении типа киоска. Пользователь должен иметь возможность перемещаться назад и вперед между этими битами контента, предпочтительно с помощью жестов сенсорного экрана в киоске, то есть касаться одной стороны экрана, чтобы двигаться вперед, а другой - назад.

К сожалению, элементы управления, отображающие содержимое, могут иметь дополнительную вложенность, поэтому я использую ловушку мыши Win32 для захвата щелчков мыши, чтобы проверить, находятся ли они в пределах указанной области. Это прекрасно работает. К сожалению, эти события щелчка (косвенно) вызывают методы для элемента управления ActiveX, который я использую для размещения презентаций PP (DSOFramer), и это вызывает неприятное исключение COM:

An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))

Мое лучшее предположение заключается в том, что низкоуровневая перехват мыши вызывается из другого потока, потому что, если я сделаю вызов непосредственно из потока пользовательского интерфейса Winforms, проблем не будет. Я попытался стандартным Winforms Invoke / BeginInvoke безуспешно.

1 Ответ

1 голос
/ 12 июля 2010

Я использовал типичный шаблон Winforms для кросс-нити:

if(InvokeRequired)
{
    Invoke(new Action(DoStuff));
}
else
{
    DoStuff();
}

Конечно, элемент управления, с которого я звоню, понятия не имеет об элементе управления AX, поэтому мне нужно явно вызвать действие. Также необходимо использовать BeginInvoke, поэтому вышеприведенное становится:

BeginInvoke(new Action(DoStuff));

Работает сейчас. Oops!

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