日期:2014-05-17  浏览次数:21174 次

C# 操作EXCEL的关闭按钮
最近用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.修改这个提示信息,如“是否保存对“book1”的更改”修改成“AAA”
FindWindow
SetWindowText
                     2.当鼠标点击这个“是”或 “否”的按钮时,在C#中获取到这个动作,如果点击了“是”,C#执行代码段A;如果点击了否,C#执行代码段B
比较困难,需要CreateRemoteThread
然后用C编写代码SubClass这个WndProc
                     3.如果2实现不了,能不能做成这样,当我点击EXCEL工作簿上的这个“X”号时,屏蔽EXCEL本身的提示信息,调用我自己定义的C#窗体程序。
SendMessage WM_COMMAND
然后自己调用MessageBox
------解决方案--------------------
本帖最后由 jiangsheng 于 2013-03-18 11:17:00 编辑

class WorkbookEventSink

    Workbook workbook;
    ISynchronizeInvoke invokeHandle;
    public WorkbookEventSink(Workbook workbook,ISynchronizeInvoke invokeHandle)
    {
        this.workbook=workbook;
        this.invokeHandle=invokeHandle;
        this.workbook.BeforeClose +=
        new Excel.WorkbookEvents_BeforeCloseEventHandler(
        Workbook_BeforeClose);
    }
    void Workbook_BeforeClose(ref bool Cancel)
    {
       if (DialogResult.Yes == 
            MessageBox.Show(Do you want to save the workbook?",
            "Example", MessageBoxButtons.YesNo))
       {
            workbook.Save();
       }
       else{
           Cancel=true;
           invokeHandle.Invoke(
               (MethodInvoker) 
                delegate { 
                     workbook.Close(false,null,false);
                }
                );    &n