社区
Office开发/ VBA
帖子详情
如何在自己的程序中显示一个PPT文档,并且能够自己截获对PPT操作的鼠标和键盘事件。
andersky
2004-09-06 09:28:30
就是在自己的程序中用一个窗口来打开并显示一个指定的PPT,并且能把用户对这个PPT的鼠标和键盘操作截获下来,自己再作处理。
...全文
359
5
打赏
收藏
如何在自己的程序中显示一个PPT文档,并且能够自己截获对PPT操作的鼠标和键盘事件。
就是在自己的程序中用一个窗口来打开并显示一个指定的PPT,并且能把用户对这个PPT的鼠标和键盘操作截获下来,自己再作处理。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gjd111686
2005-01-10
打赏
举报
回复
描述在微软知识库
http://support.microsoft.com/kb/183599
gjd111686
2005-01-10
打赏
举报
回复
使用VC++获得Microsoft Word97应用事件
概要
这文章证明怎样使用VC++.获得微软word97应用事件。但是,在这文章中观念和代码是并非对Microsoft Word特有。 他们是适用于整个套微软office应用, 以及任何其它类似的应用程序。
更多信息
下列的步给怎样建立MFC应用,它可以捕获Microsoft Word 97 Application事件Startup(), DocumentChange()和Quit():
使用MFC AppWizard创造一个新对话框。给出项目的名字WordEvents, 接受缺省的设置.给你的对话框添加两按键,并分别命名为"Start and Setup"和"Quit and Clean Up"。
添加下列的代码到 "Start and Setup"按键的句柄:
// 检查看是否你已经启动服务器.
if(m_app.m_lpDispatch != NULL) {
AfxMessageBox("Server already started.");
return;
}
char buf[256]; // General purpose buffer.
// 打开自动化服务器.
COleException e;
if(!m_app.CreateDispatch("Word.Application.8", &e)) {
sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",e.m_sc, e.m_sc);
AfxMessageBox(buf, MB_SETFOREGROUND);
return;
}
// 通过自动化使服务器变得可见.
// I.e.: Application.Visible = TRUE
DISPID dispID;
unsigned short *ucPtr;
BYTE *parmStr;
ucPtr = L"visible";
m_app.m_lpDispatch->GetIDsOfNames(IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID);
parmStr = (BYTE *)( VTS_VARIANT );
m_app.InvokeHelper(dispID, DISPATCH_METHOD | DISPATCH_PROPERTYPUT, VT_EMPTY,NULL, parmStr, &COleVariant((short)TRUE));
// 事件获得.
// {000209F7-0000-0000-C000-000000000046}
static const GUID IID_IWord8AppEvents = {0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } };
// 建立事件步骤
// 1. 得到服务器的IConnectionPointContainer接口.
// 2. 调用IConnectionPointContainerFindConnectionPoint()寻找到希望获得的接口
// 3. 调用IConnectionPoint::Advise()
HRESULT hr;
// 得到服务器的IConnectionPointContainer接口.
IConnectionPointContainer *pConnPtContainer;
hr = m_app.m_lpDispatch->QueryInterface(IID_IConnectionPointContainer,(void **)&pConnPtContainer);
ASSERT(!FAILED(hr));
// 为使你感兴趣的事件找到联系点.
hr = pConnPtContainer->FindConnectionPoint(IID_IWord8AppEvents,&m_pConnectionPoint);
ASSERT(!FAILED(hr));
// 得到你的事件实现的IUnknown界面.
LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown);
ASSERT(pUnk);
// 建立advisory联系!
hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie);
ASSERT(!FAILED(hr));
// 释放IConnectionPointContainer
pConnPtContainer->Release();
下面是"Quit and Clean Up"按钮的处理句柄代码:
// 如果你已启动服务器.
if(m_app.m_lpDispatch == NULL) {
AfxMessageBox("You haven't started the server yet.");
return;
}
m_pConnectionPoint->Unadvise(m_adviseCookie);
// 告诉服务器放弃.
// Application.Quit()
DISPID dispID; // Temporary DISPID
unsigned short *ucPtr; // Temporary name holder
ucPtr = L"quit";
m_app.m_lpDispatch->GetIDsOfNames(
IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
);
m_app.InvokeHelper(dispID, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
// 释放应用对象.
m_app.ReleaseDispatch();
打开MFC ClassWizard (CTRL+W),加入一个源自CCmdTarget的新类MyEventSink。按下面的顺序加入新方法:
void Startup()
void Quit()
void DocumentChange()
在MyEventSink.cpp中,我们会看到下面的代码:
void MyEventSink::Startup() { AfxMessageBox("MyEventSink::Startup() called."); }
void MyEventSink::Quit() { AfxMessageBox("MyEventSink::Quit() called.");}
void MyEventSink::DocumentChange(){ AfxMessageBox("MyEventSink::DocumentChange() called.");}
打开你的MyEventSink.cpp文找到IID_IMyEventSink声明. ClassWizard为你的界面产生一新的随机GUID, 但是因为你执行一已有GUID的特有接口,所以需要进行如下修改:
static const GUID IID_IMyEventSink = {0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46}};
给你的在WordEventsDlg.h中WordEventsDlg类添加下列的公共成员变量:
COleDispatchDriver m_app;
IConnectionPoint *m_pConnectionPoint;
DWORD m_adviseCookie;
MyEventSink m_myEventSink;
WordEventsDlg.h中加入下面声明:
#include "MyEventSink.h"
打开文件MyEventSink.h和找出声明的destructor;它将如下出现:
// Implementation
protected:
virtual ~MyEventSink();
在"Protected"之上写出声明:
virtual ~MyEventSink();
// Implementation
protected:
// virtual ~MyEventSink(); // 或者这行可以删除.
最后,确保OLE/COM库有机会预置.正好在你的"start and setup"按键的前面添加下列的代码.这个创造全局类。初始化函数会初始化OLE/COM库。
// Ole初始化类
class OleInitClass {
public:
OleInitClass() { OleInitialize(NULL);}
~OleInitClass() { OleUninitialize();}
};
OleInitClass g_OleInitClass;
运行下面的程序你会发现当你新建文档的时候会有一个菜单弹出。在创建事件获得函数时请按顺序进行,因为word中的这三个事件函数分别对应DISPIDs 1, 2和3,如果用户按顺序创建,则不需要修改。如果象excel中一样,事件不是按顺序的,则需要人工添加dispid号。
张海霖
2005-01-10
打赏
举报
回复
可以阿,记录相对屏幕的位置再转换
andersky
2004-09-08
打赏
举报
回复
没有人知道吗???
andersky
2004-09-06
打赏
举报
回复
最好是使用 C#来写。
鼠标
事件
键盘事件
本文详细介绍了JavaScript
中
常用的
鼠标
事件和
键盘事件
,包括onclick、onmouseover、onmouseout、onmousemove等
鼠标
事件,以及onkeyup、onkeydown、onkeypress等
键盘事件
。通过实例展示了如何实现图片跟随
鼠标
移动以及模拟快递单号实时
显示
的效果。同时,讲解了事件对象如event.clientX、event.clientY等属性的使用,以及在
键盘事件
中
如何获取按键的ASCII值。最后提供了
一个
实时
显示
输入快递单号的案例,展示了keyup事件在文本框输入时的应用。
Qt进阶开发:
鼠标
及
键盘事件
本文围绕Qt
中
鼠标
及
键盘事件
展开。介绍了Qt事件概念及处理方式,如重新实现部件事件处理函数、重写notify()函数等。详细说明了常用事件处理函数,给出自定义控件处理
鼠标
和绘图事件示例。还阐述了事件传递顺序,并提供
鼠标
及
键盘事件
的完整实例。
【Qt】QT
鼠标
和
键盘事件
本文介绍了Qt
中
的事件处理机制,重点讲解了
鼠标
和
键盘事件
的使用。通过实例展示了如何重写
鼠标
按下事件和键盘按下事件处理函数,实现
显示
鼠标
坐标和移动按钮的功能。开发环境为Windows10上的Qt5.15或Qt6。
js
鼠标
事件和
键盘事件
本文详细解析了
鼠标
和
键盘事件
的触发机制,包括
鼠标
点击、移动、键盘按键等常见事件,以及事件对象的属性如坐标获取。同时介绍了如何通过JavaScript禁用文字选择和右键菜单,为前端开发者提供实用指南。
DOM事件监听 (
鼠标
事件,
键盘事件
,表单事件)
本文介绍了DOM事件监听,涵盖
鼠标
、键盘和表单事件。事件监听可实时监测和响应特定事件,事件处理器负责处理事件。
鼠标
事件如点击、滚动等;
键盘事件
可检测输入;表单事件包括提交、重置等。还提到阻止表单默认提交及获取用户输入值,最后给出键盘监听的练习示例。
Office开发/ VBA
5,174
社区成员
17,906
社区内容
发帖
与我相关
我的任务
Office开发/ VBA
其他开发语言 Office开发/ VBA
复制链接
扫一扫
分享
社区描述
其他开发语言 Office开发/ VBA
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章