WinWordControl.cs
上传用户:zili2008
上传日期:2020-12-03
资源大小:477k
文件大小:15k
源码类别:

编辑框

开发平台:

Visual Basic

  1. /// This code has been changed by Anup Shinde.
  2. /// contact: anup@micromacs.com   ...:)
  3. /// The original code is written by Matthias Haenel
  4. /// contact: www.intercopmu.de
  5. /// Code was received from: http://www.codeproject.com/cs/miscctrl/winwordcontrol.asp
  6. /// 
  7. /// you can use it free of charge, but please 
  8. /// mention my name ;)
  9. /// 
  10. /// WinWordControl utilizes MS-WinWord2000 and 
  11. /// WinWord-XP
  12. /// 
  13. /// It simulates a form element, with simple tricks.
  14. ///
  15. using System;
  16. using System.Collections;
  17. using System.ComponentModel;
  18. using System.Drawing;
  19. using System.Data;
  20. using System.Windows.Forms;
  21. using System.Runtime.InteropServices;
  22. namespace WinWordControl
  23. {
  24. /// <summary>
  25. /// WinWordControl allows you to load doc-Files to your
  26. /// own application without any loss, because it uses 
  27. /// the real WinWord.
  28. /// </summary>
  29. public class WinWordControl : System.Windows.Forms.UserControl
  30. {
  31. #region "API usage declarations"
  32. [DllImport("user32.dll")]
  33. public static extern int FindWindow(string strclassName, string strWindowName);
  34. [DllImport("user32.dll")]
  35. static extern int SetParent( int hWndChild, int hWndNewParent);
  36. [DllImport("user32.dll", EntryPoint="SetWindowPos")]
  37. static extern bool SetWindowPos(
  38. int hWnd,               // handle to window
  39. int hWndInsertAfter,    // placement-order handle
  40. int X,                  // horizontal position
  41. int Y,                  // vertical position
  42. int cx,                 // width
  43. int cy,                 // height
  44. uint uFlags             // window-positioning options
  45. );
  46. [DllImport("user32.dll", EntryPoint="MoveWindow")]
  47. static extern bool MoveWindow(
  48. int爃Wnd, 
  49. int X, 
  50. int Y, 
  51. int爊Width, 
  52. int爊Height, 
  53. bool燽Repaint
  54. );
  55. [DllImport("user32.dll", EntryPoint="DrawMenuBar")]
  56. static extern Int32 DrawMenuBar(
  57. Int32 hWnd
  58. );
  59. [DllImport("user32.dll", EntryPoint="GetMenuItemCount")]
  60. static extern Int32 GetMenuItemCount(
  61. Int32 hMenu
  62. );
  63. [DllImport("user32.dll", EntryPoint="GetSystemMenu")]
  64. static extern Int32 GetSystemMenu(
  65. Int32 hWnd,
  66. bool燽Revert
  67. );
  68. [DllImport("user32.dll", EntryPoint="RemoveMenu")]
  69. static extern Int32 RemoveMenu(
  70. Int32 hMenu,
  71. Int32 nPosition,
  72. Int32 wFlags
  73. );
  74. private const int MF_BYPOSITION = 0x400;
  75. private const int MF_REMOVE = 0x1000;
  76. const int SWP_DRAWFRAME = 0x20;
  77. const int SWP_NOMOVE = 0x2;
  78. const int SWP_NOSIZE = 0x1;
  79. const int SWP_NOZORDER = 0x4;
  80. #endregion
  81. /* I was testing wheater i could fix some exploid bugs or not.
  82.  * I left this stuff in here for people who need to know how to 
  83.  * interface the Win32-API
  84. [StructLayout(LayoutKind.Sequential)]
  85. public struct RECT 
  86. {
  87. public int left;
  88. public int top;
  89. public int right;
  90. public int bottom;
  91. }
  92. [DllImport("user32.dll")]
  93. public static extern int GetWindowRect(int hwnd, ref RECT rc);
  94. [DllImport("user32.dll")]
  95. public static extern IntPtr PostMessage(
  96. int hWnd, 
  97. int msg, 
  98. int wParam, 
  99. int lParam
  100. );
  101. */
  102. /// <summary>
  103. /// Change. Made the following variables public.
  104. /// </summary>
  105. public  Word.Document document;
  106. public static Word.ApplicationClass wd = null;
  107. public  static int wordWnd = 0;
  108. public static string filename = null;
  109. private static bool deactivateevents = false;
  110. /// <summary>
  111. /// needed designer variable
  112. /// </summary>
  113. private System.ComponentModel.Container components = null;
  114. public WinWordControl()
  115. {
  116. InitializeComponent();
  117. }
  118. /// <summary>
  119. /// cleanup Ressources
  120. /// </summary>
  121. protected override void Dispose( bool disposing )
  122. {
  123. CloseControl();
  124. if( disposing )
  125. {
  126. if( components != null )
  127. components.Dispose();
  128. }
  129. base.Dispose( disposing );
  130. }
  131. #region Component Designer generated code
  132. /// <summary>
  133. /// !do not alter this code! It's designer code
  134. /// </summary>
  135. private void InitializeComponent()
  136. {
  137. // 
  138. // WinWordControl
  139. // 
  140. this.Name = "WinWordControl";
  141. this.Size = new System.Drawing.Size(440, 336);
  142. this.Resize += new System.EventHandler(this.OnResize);
  143. }
  144. #endregion
  145. /// <summary>
  146. /// Preactivation
  147. /// It's usefull, if you need more speed in the main Program
  148. /// so you can preload Word.
  149. /// </summary>
  150. public void PreActivate()
  151. {
  152. if(wd == null) wd = new Word.ApplicationClass();
  153. }
  154. /// <summary>
  155. /// Close the current Document in the control --> you can 
  156. /// load a new one with LoadDocument
  157. /// </summary>
  158. public void CloseControl()
  159. {
  160. /*
  161. * this code is to reopen Word.
  162. */
  163. try
  164. {
  165. deactivateevents = true;
  166. object dummy=null;
  167. object dummy2=(object)false;
  168. document.Close(ref dummy, ref dummy, ref dummy);
  169. // Change the line below.
  170. wd.Quit(ref dummy2, ref dummy, ref dummy);
  171. deactivateevents = false;
  172. }
  173. catch(Exception ex)
  174. {
  175. String strErr = ex.Message;
  176. }
  177. }
  178. /// <summary>
  179. /// catches Word's close event 
  180. /// starts a Thread that send a ESC to the word window ;)
  181. /// </summary>
  182. /// <param name="doc"></param>
  183. /// <param name="test"></param>
  184. private void OnClose(Word.Document doc, ref bool cancel)
  185. {
  186. if(!deactivateevents)
  187. {
  188. cancel=true;
  189. }
  190. }
  191. /// <summary>
  192. /// catches Word's open event
  193. /// just close
  194. /// </summary>
  195. /// <param name="doc"></param>
  196. private void OnOpenDoc(Word.Document doc)
  197. {
  198. OnNewDoc(doc);
  199. }
  200. /// <summary>
  201. /// catches Word's newdocument event
  202. /// just close
  203. /// </summary>
  204. /// <param name="doc"></param>
  205. private void OnNewDoc(Word.Document doc)
  206. {
  207. if(!deactivateevents)
  208. {
  209. deactivateevents=true;
  210. object dummy = null;
  211. doc.Close(ref dummy,ref dummy,ref dummy);
  212. deactivateevents=false;
  213. }
  214. }
  215. /// <summary>
  216. /// catches Word's quit event
  217. /// normally it should not fire, but just to be shure
  218. /// safely release the internal Word Instance 
  219. /// </summary>
  220. private void OnQuit()
  221. {
  222. //wd=null;
  223. }
  224. /// <summary>
  225. /// Loads a document into the control
  226. /// </summary>
  227. /// <param name="t_filename">path to the file (every type word can handle)</param>
  228. public void LoadDocument(string t_filename)
  229. {
  230. deactivateevents = true;
  231. filename = t_filename;
  232. if(wd == null) wd = new Word.ApplicationClass();
  233. try 
  234. {
  235. wd.CommandBars.AdaptiveMenus = false;
  236. wd.DocumentBeforeClose += new Word.ApplicationEvents2_DocumentBeforeCloseEventHandler(OnClose);
  237. wd.NewDocument += new Word.ApplicationEvents2_NewDocumentEventHandler(OnNewDoc);
  238. wd.DocumentOpen+= new Word.ApplicationEvents2_DocumentOpenEventHandler(OnOpenDoc);
  239. wd.ApplicationEvents2_Event_Quit += new Word.ApplicationEvents2_QuitEventHandler(OnQuit);
  240. }
  241. catch{}
  242. if(document != null) 
  243. {
  244. try
  245. {
  246. object dummy=null;
  247. wd.Documents.Close(ref dummy, ref dummy, ref dummy);
  248. }
  249. catch{}
  250. }
  251. if( wordWnd==0 ) wordWnd = FindWindow( "Opusapp", null);
  252. if (wordWnd!=0)
  253. {
  254. SetParent( wordWnd, this.Handle.ToInt32());
  255. object fileName = filename;
  256. object newTemplate = false;
  257. object docType = 0;
  258. object readOnly = true;
  259. object isVisible = true;
  260. object missing = System.Reflection.Missing.Value;
  261. try
  262. {
  263. if( wd == null )
  264. {
  265. throw new WordInstanceException();
  266. }
  267. if( wd.Documents == null )
  268. {
  269. throw new DocumentInstanceException();
  270. }
  271. if( wd != null && wd.Documents != null )
  272. {
  273. document = wd.Documents.Add(ref fileName, ref newTemplate, ref docType, ref isVisible);
  274. }
  275. if(document == null)
  276. {
  277. throw new ValidDocumentException();
  278. }
  279. }
  280. catch
  281. {
  282. }
  283. try
  284. {
  285. wd.ActiveWindow.DisplayRightRuler=false;
  286. wd.ActiveWindow.DisplayScreenTips=false;
  287. wd.ActiveWindow.DisplayVerticalRuler=false;
  288. wd.ActiveWindow.DisplayRightRuler=false;
  289. wd.ActiveWindow.ActivePane.DisplayRulers=false;
  290. wd.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdWebView; 
  291. //wd.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdPrintView;//wdWebView; // .wdNormalView;
  292. }
  293. catch
  294. {
  295. }
  296. /// Code Added
  297. /// Disable the specific buttons of the command bar
  298. /// By default, we disable/hide the menu bar
  299. /// The New/Open buttons of the command bar are disabled
  300. /// Other things can be added as required (and supported ..:) )
  301. /// Lots of commented code in here, if somebody needs to disable specific menu or sub-menu items.
  302. /// 
  303. int counter = wd.ActiveWindow.Application.CommandBars.Count;
  304. for(int i = 1; i <= counter;i++)
  305. {
  306. try
  307. {
  308. String nm=wd.ActiveWindow.Application.CommandBars[i].Name;
  309. if(nm=="Standard")
  310. {
  311. //nm=i.ToString()+" "+nm;
  312. //MessageBox.Show(nm);
  313. int count_control=wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
  314. for(int j=1;j<=2;j++)
  315. {
  316. //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].ToString());
  317. wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled=false;
  318. }
  319. }
  320. if(nm=="Menu Bar")
  321. {
  322. //To disable the menubar, use the following (1) line
  323. wd.ActiveWindow.Application.CommandBars[i].Enabled=false;
  324. /// If you want to have specific menu or sub-menu items, write the code here. 
  325. /// Samples commented below
  326. // MessageBox.Show(nm);
  327. //int count_control=wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
  328. //MessageBox.Show(count_control.ToString());
  329. /*
  330. for(int j=1;j<=count_control;j++)
  331. {
  332. /// The following can be used to disable specific menuitems in the menubar
  333. /// wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled=false;
  334. //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].ToString());
  335. //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].Caption);
  336. //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].accChildCount.ToString());
  337. ///The following can be used to disable some or all the sub-menuitems in the menubar
  338.  
  339. ////Office.CommandBarPopup c;
  340. ////c = (Office.CommandBarPopup)wd.ActiveWindow.Application.CommandBars[i].Controls[j];
  341. ////
  342. ////for(int k=1;k<=c.Controls.Count;k++)
  343. ////{
  344. //// //MessageBox.Show(k.ToString()+" "+c.Controls[k].Caption + " -- " + c.Controls[k].DescriptionText + " -- " );
  345. //// try
  346. //// {
  347. //// c.Controls[k].Enabled=false;
  348. //// c.Controls["Close Window"].Enabled=false;
  349. //// }
  350. //// catch
  351. //// {
  352. ////
  353. //// }
  354. ////}
  355. //wd.ActiveWindow.Application.CommandBars[i].Controls[j].Control  Controls[0].Enabled=false;
  356. }
  357. */
  358. }
  359. nm="";
  360. }
  361. catch(Exception ex)
  362. {
  363. MessageBox.Show(ex.ToString());
  364. }
  365. }
  366. // Show the word-document
  367. try
  368. {
  369. wd.Visible = true;
  370. wd.Activate();
  371. SetWindowPos(wordWnd,this.Handle.ToInt32(),0,0,this.Bounds.Width,this.Bounds.Height, SWP_NOZORDER | SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOSIZE);
  372. //Call onresize--I dont want to write the same lines twice
  373. OnResize();
  374. }
  375. catch
  376. {
  377. MessageBox.Show("Error: do not load the document into the control until the parent window is shown!");
  378. }
  379. /// We want to remove the system menu also. The title bar is not visible, but we want to avoid accidental minimize, maximize, etc ..by disabling the system menu(Alt+Space)
  380. try
  381. {
  382. int hMenu = GetSystemMenu(wordWnd, false);
  383. if(hMenu>0)
  384. {
  385. int menuItemCount = GetMenuItemCount(hMenu);
  386. RemoveMenu(hMenu, menuItemCount - 1, MF_REMOVE | MF_BYPOSITION);
  387. RemoveMenu(hMenu, menuItemCount - 2, MF_REMOVE | MF_BYPOSITION);
  388. RemoveMenu(hMenu, menuItemCount - 3, MF_REMOVE | MF_BYPOSITION);
  389. RemoveMenu(hMenu, menuItemCount - 4, MF_REMOVE | MF_BYPOSITION);
  390. RemoveMenu(hMenu, menuItemCount - 5, MF_REMOVE | MF_BYPOSITION);
  391. RemoveMenu(hMenu, menuItemCount - 6, MF_REMOVE | MF_BYPOSITION);
  392. RemoveMenu(hMenu, menuItemCount - 7, MF_REMOVE | MF_BYPOSITION);
  393. RemoveMenu(hMenu, menuItemCount - 8, MF_REMOVE | MF_BYPOSITION);
  394. DrawMenuBar(wordWnd);
  395. }
  396. }
  397. catch{};
  398. this.Parent.Focus();
  399. }
  400. deactivateevents = false;
  401. }
  402. /// <summary>
  403. /// restores Word.
  404. /// If the program crashed somehow.
  405. /// Sometimes Word saves it's temporary settings :(
  406. /// </summary>
  407. public void RestoreWord()
  408. {
  409. try
  410. {
  411. int counter = wd.ActiveWindow.Application.CommandBars.Count;
  412. for(int i = 0; i < counter;i++)
  413. {
  414. try
  415. {
  416. wd.ActiveWindow.Application.CommandBars[i].Enabled=true;
  417. }
  418. catch
  419. {
  420. }
  421. }
  422. }
  423. catch{};
  424. }
  425. /// <summary>
  426. /// internal resize function
  427. /// utilizes the size of the surrounding control
  428. /// 
  429. /// optimzed for Word2000 but it works pretty good with WordXP too.
  430. /// </summary>
  431. /// <param name="sender"></param>
  432. /// <param name="e"></param>
  433. private void OnResize()
  434. {
  435. //The original one that I used is shown below. Shows the complete window, but its buttons (min, max, restore) are disabled
  436. //// MoveWindow(wordWnd,0,0,this.Bounds.Width,this.Bounds.Height,true);
  437. ///Change below
  438. ///The following one is better, if it works for you. We donot need the title bar any way. Based on a suggestion.
  439. int borderWidth = SystemInformation.Border3DSize.Width;
  440. int borderHeight = SystemInformation.Border3DSize.Height;
  441. int captionHeight = SystemInformation.CaptionHeight;
  442. int statusHeight = SystemInformation.ToolWindowCaptionHeight;
  443. MoveWindow(
  444. wordWnd, 
  445. -2*borderWidth,
  446. -2*borderHeight - captionHeight, 
  447. this.Bounds.Width + 4*borderWidth, 
  448. this.Bounds.Height + captionHeight + 4*borderHeight + statusHeight,
  449. true);
  450. }
  451. private void OnResize(object sender, System.EventArgs e)
  452. {
  453. OnResize();
  454. }
  455. /// Required. 
  456. /// Without this, the command bar buttons that have been disabled 
  457. /// will remain disabled permanently (does not occur at every machine or every time)
  458. public  void RestoreCommandBars()
  459. {
  460. try
  461. {
  462. int counter = wd.ActiveWindow.Application.CommandBars.Count;
  463. for(int i = 1; i <= counter;i++)
  464. {
  465. try
  466. {
  467. String nm=wd.ActiveWindow.Application.CommandBars[i].Name;
  468. if(nm=="Standard")
  469. {
  470. int count_control=wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
  471. for(int j=1;j<=2;j++)
  472. {
  473. wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled=true;
  474. }
  475. }
  476. if(nm=="Menu Bar")
  477. {
  478. wd.ActiveWindow.Application.CommandBars[i].Enabled=true;
  479. }
  480. nm="";
  481. }
  482. catch(Exception ex)
  483. {
  484. MessageBox.Show(ex.ToString());
  485. }
  486. }
  487. }
  488. catch{}
  489. }
  490. }
  491. public class DocumentInstanceException : Exception
  492. {}
  493. public class ValidDocumentException : Exception
  494. {}
  495. public class WordInstanceException : Exception
  496. {}
  497. }