最近用C#做一个小软件,遇到这样一个问题:关闭EXCEL工作簿时(这里是点击EXCEL工作簿上的“X”号,不是EXCEL主菜单上的“X”号),EXCEL本身会有保存提示。如图:
  想实现这样3个功能:1.修改这个提示信息,如“是否保存对“book1”的更改”修改成“AAA”
                     2.当鼠标点击这个“是”或 “否”的按钮时,在C#中获取到这个动作,如果点击了“是”,C#执行代码段A;如果点击了否,C#执行代码段B
                     3.如果2实现不了,能不能做成这样,当我点击EXCEL工作簿上的这个“X”号时,屏蔽EXCEL本身的提示信息,调用我自己定义的C#窗体程序。接触C#时间不长,摸索了一阵子句柄的方法,进展不大。
近来因为此事,折腾不轻,希望高手能给我指点,小弟感激不尽。

解决方案 »

  1.   

    补充一点,当前的EXCEL工作簿,是通过C#的workbook。open(filename)方法打开的
      

  2.   

    1.修改这个提示信息,如“是否保存对“book1”的更改”修改成“AAA”
    FindWindow
    SetWindowText
                         2.当鼠标点击这个“是”或 “否”的按钮时,在C#中获取到这个动作,如果点击了“是”,C#执行代码段A;如果点击了否,C#执行代码段B
    比较困难,需要CreateRemoteThread
    然后用C编写代码SubClass这个WndProc
                         3.如果2实现不了,能不能做成这样,当我点击EXCEL工作簿上的这个“X”号时,屏蔽EXCEL本身的提示信息,调用我自己定义的C#窗体程序。
    SendMessage WM_COMMAND
    然后自己调用MessageBox
      

  3.   


    我需要获取关闭时执行的操作,“是”或“否”.close关闭没问题,但抓取不到这个状态啊
      

  4.   

      3跨进程操作,截取wm_close调用自己的方法 
      

  5.   

    本帖最后由 jiangsheng 于 2013-03-18 11:17:00 编辑
      

  6.   

       Form装在excel:                            axWebBrowser.GetType().InvokeMember("ExecWB",BindingFlags.InvokeMethod,null,axWebBrowser,args);
       拦截excel关闭按钮: AppEvents_Event)excel).WorkbookBeforeClose+=new AppEvents_WorkbookBeforeCloseEventHandler(ExcelClose_WorkbookBeforeClose);// += new AppEvents_NewWorkbookEventHandler(ExcelClose_NewWorkbook);xcel添加数据:
          eApp = (Microsoft.Office.Interop.Excel.Application)oApplication;//这样就可以象上文中所述来操作Excel了。
                eApp.Cells[1, 1] = "First Row First Column";
                eApp.Cells[1, 2] = "First Row Second Column";
                eApp.Cells[2, 1] = "Second Row First Column";
                eApp.Cells[2, 2] = "Second Row Second Column";