2015-01-28 2 views
0

Итак, мне, наконец, пришлось иметь дело с этой досадной проблемой. Похоже, что это известная «ошибка», и, похоже, нет большой работы. Мне было интересно, что для этого лучше всего подходит.Регион Форматирования 2013 года и ключ удаления

Немного информации. В моей области формы у меня есть элемент управления Winform и элемент управления WPF. Пользователь не может выполнять определенные комбинации клавиш в элементе управления Winform (Ctrl-A, чтобы выбрать все, клавиша Delete удаляет электронную почту вместо выделенного текста), но все отлично работает с элементом управления WPF.

Я попытался добавить элемент управления Winform в элемент управления WPF с помощью WindowsFormHost, но это сделало его еще хуже, так как после этого он не зарегистрировал бы клавишу backspace. Я попытался захватить событие delete для электронной почты, но я не могу заставить .BeforeDelete запускать. То же самое для события Explorer.BeforeItemCut. В настоящее время я пытаюсь захватить событие WndProc, чтобы перенаправить ключевые события, но похоже, что должен быть лучший/более простой способ.

Не знаете, как продолжить работу здесь. Любая помощь в направлении приветствуется. Ниже приведена информация о том, как я пытаюсь захватить событие удаления электронной почты.

Outlook.MailItem _selEmail; 

// This does get triggered 
private void Explorer_SelectionChange() 
{ 
    var actExplorer = this.Application.ActiveExplorer(); 
    if(this.Application.ActiveExplorer().Selection.Count > 0) 
    { 
     var selObject = actExplorer.Selection[1]; 
     if(selObject is Outlook.MailItem) 
     { 
      _selEmail = selObject as Outlook.MailItem; 
      _selEmail.BeforeEmailDelete -= 
       new Outlook.ItemEvents_10_BeforeDeleteEventHandler(Email_BeforeDelete); 
      _selEmail.BeforeEmailDelete += 
       new Outlook.ItemEvents_10_BeforeDeleteEventHandler(Email_BeforeDelete); 
     } 
    } 
} 

// Haven't gotten this to trigger. The Console.Write("") is there 
// only for a breakpoint; 
private void Email_BeforeDelete(object sender, ref bool cancel) 
{ 
    Console.WriteLine(""); 
} 

ответ

1

Прежде всего, я хотел бы предложить разорвать цепочку вызовов свойств и методов и объявить каждое свойство или метод вызова на отдельной строке кода. Таким образом, вы сможете выпустить базовые COM-объекты на место. Используйте System.Runtime.InteropServices.Marshal.ReleaseComObject, чтобы освободить объект Outlook, когда вы его закончили. Затем установите переменную Nothing в Visual Basic (null на C#), чтобы освободить ссылку на объект. Вы можете узнать больше об этом в статье Systematically Releasing Objects в MSDN.

Попробуйте отключить Считывание одного ключа с помощью пробела в Outlook, который позволяет быстро перемещаться по сообщениям в области чтения. Пробел пробегает текущий элемент. В конце элемента он переходит к следующему непрочитанному элементу в списке сообщений.

enter image description here

Наконец, с помощью элементов управления WPF на формы Outlook, производят хорошо известную проблему. Outlook имеет привычку глотать различные ключи и не отправлять их вместе с вашим кодом или регистром. Клавиши пробела, табуляции, клавиши обратного хода относятся к числу тех, которые затронуты при нажатии клавиш в области чтения. Вы можете найти similar forum thread.

+0

Благодарим за предоставление совета. У меня, кажется, нет проблем с пробелом вообще, и WPF-контроль работает отлично (я могу выбрать весь текст и удалить). Это только контроль Winforms в области, который не получает клавиши Delete или Ctrl, однако он получает ключ backspace. – Natzely