#c# #multithreading #winforms #ms-word #office-interop
#c# #многопоточность #winforms #ms-word #office-взаимодействие
Вопрос:
В приложении Windows Forms мне нужно открыть документ Word и скрыть основную форму, а над документом Word мне нужно открыть модальное диалоговое окно. Когда отображается модальное диалоговое окно, слово должно быть отключено, что означает, что пользователь не может прокручивать, масштабировать или писать что-либо в документе. Документ будет управляться модальным диалогом.
Теперь я использую функцию из user32.dll , с помощью которого я устанавливаю родительский процесс для модального диалогового окна, чтобы при скрытии основной формы модальное диалоговое окно оставалось видимым.
[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr child, IntPtr newParent);
Проблема в том, что если я открою модальное диалоговое окно с помощью Show()
или ShowModal()
, у меня все равно будет доступ к документу Word, и если я открою его с помощью ShowDialog()
, форма вроде как интегрирована в документ, и я не могу щелкнуть по ней или сфокусировать ее.
Кто-нибудь может сказать мне, как я могу заблокировать документ Word и при этом иметь доступ к модальному диалогу?
Есть ли Office.Interop.Word
функция, которая может помочь?
Ответ №1:
Я думаю, что лучшим решением было бы написать дополнение Word, но это потребует много работы и может оказаться невозможным для вас в данный момент.
Я думаю, что вторым лучшим решением было бы скрыть Word при отображении модального диалога.
Комментарии:
1. Я не могу скрыть word, потому что с помощью некоторых кнопок из формы мне нужно изменить, выделить или переместить текст документа Word. Я думал о том, чтобы показать документ в PrintPreview, я спрятал линейки и полосы прокрутки. Но я не знаю, что еще деактивировать, чтобы пользователь не мог щелкнуть или что-то сделать с документом. И да, создание надстройки Word с функциональностью модальной формы — это большая работа. Я пытаюсь найти более простое решение, если оно есть.
2. Я вижу. Интересно, почему это было бы такой проблемой, если бы кто-то редактировал документ. Было бы больно, если бы они это сделали? Если да, то почему? Может быть, вы можете это исправить, чтобы пользователь мог просто редактировать документ, пока форма открыта, если захочет.
Ответ №2:
То, что вы описываете, — это не правильный путь … чтобы достичь желаемого, вам нужно внедрить надстройку Office вместо приложения WinForms … пошаговое руководство, включая исходный код, о том, как это сделать, см.http://msdn.microsoft.com/en-us/library/bb157892.aspx
РЕДАКТИРОВАТЬ — согласно комментариям:
Другим вариантом было бы отобразить документ Word в формате PDF и отобразить это … для редактирования документа Word вы можете использовать OpenXML из MS (бесплатно) и / или Aspose.Слова (коммерческая) или аналогичная библиотека…
Комментарии:
1. Я искал более быстрое решение, но, возможно, у меня нет выбора. Я подумывал о том, чтобы показать документ в PrintPreview и отключить некоторые пользовательские функции. Например, я удалил функцию Escape key (которая выводила из режима PrintPreview), я удалил линейки и полосы прокрутки, но я не знаю, как удалить доступ всех пользователей, например, прокрутку вниз или масштабирование документа. И делать это было бы так безопасно, потому что я мог бы что-то пропустить, потому что есть масса вещей, которые можно сделать, и трудно идентифицировать и заблокировать их все.
2. Я не вижу более быстрого решения — по крайней мере, это было бы безопасно … другим вариантом было бы сгенерировать PDF-файл и показать его вместо документа Word… и отредактируйте документ Word в скрытом Word или с помощью библиотеки, такой как OpenXML или Aspose. Слова .
Ответ №3:
Да, документ может быть заблокирован в форме с помощью word vbModal
:
Sub AutoOpen()
frmIntro.Show vbModal
End Sub
Комментарии:
1. Еще лучше, документ может быть скрыт до тех пор, пока не будет закрыта открывающая форма: ActiveWindow. Видимый = False во вложенном автозапуске, за которым следует ActiveWindow. Видимый = True, когда форма закрыта.