C# 操作EXCEL的关闭按钮

zxbqqx 2013-03-17 11:00:25
最近用C#做一个小软件,遇到这样一个问题:关闭EXCEL工作簿时(这里是点击EXCEL工作簿上的“X”号,不是EXCEL主菜单上的“X”号),EXCEL本身会有保存提示。如图:
想实现这样3个功能:1.修改这个提示信息,如“是否保存对“book1”的更改”修改成“AAA”
2.当鼠标点击这个“是”或 “否”的按钮时,在C#中获取到这个动作,如果点击了“是”,C#执行代码段A;如果点击了否,C#执行代码段B
3.如果2实现不了,能不能做成这样,当我点击EXCEL工作簿上的这个“X”号时,屏蔽EXCEL本身的提示信息,调用我自己定义的C#窗体程序。

接触C#时间不长,摸索了一阵子句柄的方法,进展不大。
近来因为此事,折腾不轻,希望高手能给我指点,小弟感激不尽。

...全文
386 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2013-03-18
  • 打赏
  • 举报
回复
用vsto写,直接用close事件
菜牛 2013-03-18
  • 打赏
  • 举报
回复
自己打开的文档,响应其事件不就可以了?
蒋晟 2013-03-18
  • 打赏
  • 举报
回复

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);
}
);
}
}
}
江湖评谈 2013-03-18
  • 打赏
  • 举报
回复
3跨进程操作,截取wm_close调用自己的方法
星空独行 2013-03-18
  • 打赏
  • 举报
回复
期盼高手出现,等待学习
zxbqqx 2013-03-18
  • 打赏
  • 举报
回复
求测试代码,我好找葫芦画瓢,多谢各位!
zxbqqx 2013-03-18
  • 打赏
  • 举报
回复
引用 5 楼 liucqa 的回复:
用vsto写,直接用close事件
我需要获取关闭时执行的操作,“是”或“否”.close关闭没问题,但抓取不到这个状态啊
zxbqqx 2013-03-18
  • 打赏
  • 举报
回复
引用 10 楼 jiangsheng 的回复:
本帖最后由 jiangsheng 于 2013-03-18 11:17:00 编辑 C# code ? 1234567891011121314151617181920212223242526272829303132 class WorkbookEventSink { Workbook workbook; ISynchronizeInvoke inv……
不知道从哪下手测试这段代码
zxbqqx 2013-03-18
  • 打赏
  • 举报
回复
引用 11 楼 tangyanzhi1111 的回复:
Form装在excel: axWebBrowser.GetType().InvokeMember("ExecWB",BindingFlags.InvokeMethod,null,axWebBrowser,args); 拦截excel关闭按钮: AppEvents_Event)excel).WorkbookBeforeClose+=……
不明白了
江湖评谈 2013-03-18
  • 打赏
  • 举报
回复
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";
zxbqqx 2013-03-17
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
1.修改这个提示信息,如“是否保存对“book1”的更改”修改成“AAA” FindWindow SetWindowText 2.当鼠标点击这个“是”或 “否”的按钮时,在C#中获取到这个动作,如果点击了“是”,C#执行代码段A;如果点击了否,C#执行代码段B 比较困难,需要CreateRemoteThread 然后用C……
版主能给我简单写下代码吗,小弟对这个真不熟,多谢
threenewbee 2013-03-17
  • 打赏
  • 举报
回复
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
zxbqqx 2013-03-17
  • 打赏
  • 举报
回复
补充一点,当前的EXCEL工作簿,是通过C#的workbook。open(filename)方法打开的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧