Я пишу приложение, которое использует TwainDotNet для сканирования.Могу ли я фильтровать сообщение из окна в другом потоке?
Все работает нормально, но сканирование делает пользовательский интерфейс непригодным для использования. Поэтому я решил отсканировать в другом потоке, но у меня никогда не было успешного сканирования. Поэтому я решил взять более близкий взгляд на реализацию:
public DataSourceManager(Identity applicationId,
IWindowsMessageHook messageHook)
{
// Make a copy of the identity in case it gets modified
ApplicationId = applicationId.Clone();
ScanningComplete += delegate { };
TransferImage += delegate { };
_messageHook = messageHook;
_messageHook.FilterMessageCallback = FilterMessage;
IntPtr windowHandle = _messageHook.WindowHandle;
_eventMessage.EventPtr =
Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WindowsMessage)));
И метод, который делает фильтрацию:
protected IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam,
IntPtr lParam, ref bool handled)
{
Обычно этот метод фильтрует журнал сообщений, но если я просматриваю в другой нить не получаю.
Сканирующая часть моего кода:
var scanningThread = new Thread((ThreadStart) delegate
{
// Previously I got the main UI form here, but that didn't work either
var form = new Form();
var messageHook = new WinFormsWindowMessageHook(form.Handle);
var scanner = new TwainEngine(messageHook);
scanner.TransferImage += TransferImage;
scanner.ScanningComplete += ScanningComplete;
scanner.StartScanning(twainSettings);
});
scanningThread.Start();
Я ничего не знаю об архитектуре сообщений Win32 так что любой вход на том, как я мог бы решить эту проблему или то, что вызывает эта проблема была бы полезно.
Бадди, ты ошибешься. Не создавайте форму в другой теме. И ручка для формы, которая не показана, бесполезна. Вы уверены, что не блокируете графический интерфейс, ожидая завершения сканирования? – Brannon
@Brannon: Спасибо за ответ. Я уверен, что я ничего не блокирую. У этой демонстрационной программы есть такая же проблема. – xsl