C# 窗体应用程序中点击事件如何跟键盘按钮绑定 麻烦给个简单的代码。参考一下

C# 窗体应用程序中点击事件如何跟键盘按钮绑定 麻烦给个简单的代码。参考一下,第1张

快捷键?很简单啊

如颤昌下羡让例,在窗体pkForm中有个按钮名为tuichu,设置快捷键为C

private void pkForm_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode==Keys.C)

{

tuichu_Click(null, null)

}

}

要提醒的是先把窗体的KeyPreview设为true。

当使用Ctrl + *快捷键时

private void pkForm_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.F &&e.Control)

{

dakai_Click(null, null)//执行单击dakai按钮的单击茄派扒事件

}

}

下面的步骤说明如何创建 MFC 应用程序捕捉 Startup()、 DocumentChange() 和 Quit() 的 Microsoft Word 97 应用程序事件:

创建新对话框基于应用程序使用 MFC 应用程序向导。命名您的项目 WordEvents,并接受默认设置。

分别将没搏歼两个按钮添加到您的对话框和名称"启动和安装程枯冲序"和"退出并清理,"的按钮。

将下面的代码添加到处理银御程序的"启动和安装"按钮:

// Check to see if you've already started the server.

if(m_app.m_lpDispatch != NULL) {

AfxMessageBox("Server already started.")

return

}

char buf[256]// General purpose buffer.

// Start Automation server.

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

}

// Make server visible through automation.

// 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)

)

// Declare the events you want to catch.

// {000209F7-0000-0000-C000-000000000046}

static const GUID IID_IWord8AppEvents =

{0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } }

// Steps for setting up events.

// 1. Get server's IConnectionPointContainer interface.

// 2. Call IConnectionPointContainerFindConnectionPoint()

//to find the event you want to catch.

// 3. Call IConnectionPoint::Advise() with the IUnknown

//interface of your implementation of the events.

HRESULT hr

// Get server's IConnectionPointContainer interface.

IConnectionPointContainer *pConnPtContainer

hr = m_app.m_lpDispatch->QueryInterface(

IID_IConnectionPointContainer,

(void **)&pConnPtContainer

)

ASSERT(!FAILED(hr))

// Find connection point for events you're interested in.

hr = pConnPtContainer->FindConnectionPoint(

IID_IWord8AppEvents,

&m_pConnectionPoint

)

ASSERT(!FAILED(hr))

// Get the IUnknown interface of your event implementation.

LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown)

ASSERT(pUnk)

// Setup advisory connection!

hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie)

ASSERT(!FAILED(hr))

// Release IConnectionPointContainer interface.

pConnPtContainer->Release()

将下面的代码添加到处理程序的"退出并清理"按钮:

// Check if you've started the server.

if(m_app.m_lpDispatch == NULL) {

AfxMessageBox("You haven't started the server yet.")

return

}

m_pConnectionPoint->Unadvise(m_adviseCookie)

// Tell server to quit.

// 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)

// Release application object.

m_app.ReleaseDispatch()

启动 MFC 类向导 (CTRL + W),并添加一个新的类派生从 CCmdTarget,并支持自动化 (请选中"自动"选项)。命名此类 MyEventSink ;它将是我们实现的 Microsoft Word 的应用程序事件。

在 MFC 类向导中,单击自动选项卡,并按顺序添加这三种方法:

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 的声明。类向导生成一个新的随机 GUID,您的接口,但因为要实现特定的接口,已经有一个 GUID,您需要更改您要匹配的。修改 IID_IMyEventSink 的声明,如下所示: 静态常量的 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

右前类 CWordEventsDlg 声明为 WordEventsDlg.h 中添加以下行:

#include "MyEventSink.h"

打开文件 MyEventSink.h,并查找该声明的析构函数 ;它会显示如下:

// Implementation

protected:

virtual ~MyEventSink()

移动该声明上方"保护"一词,使的代码行,如下所示:

virtual ~MyEventSink()

// Implementation

protected:

// virtual ~MyEventSink()// Or this line may be removed.

最后,确保 OLE/COM 库有机会初始化。添加以下代码右前"启动和安装"按钮处理程序。这将创建一个全局类获取应用程序启动时创建和销毁在退出。构造函数和析构函数,此类提供了简便的方法来执行初始化和清理代码:

// Ole-initialization class.

class OleInitClass {

public:

OleInitClass() {

OleInitialize(NULL)

}

~OleInitClass() {

OleUninitialize()

}

}

// This global class calls OleInitialize() at

// application startup, and calls OleUninitialize()

// at application exit.

OleInitClass g_OleInitClass

编译并运行。

之后运行应用程序,请单击"开始和安装"按钮来启动 Microsoft Word 和设置事件通知。在 Microsoft Word 中,在文件菜单上,单击新建以创建一个新文档。DocumentChange() 活动应得到激发。打开另一个文档,并注意到它还获取激发时,切换到另一个文档中的激活。您可以单击"退出和清理"按钮停止的事件通知,退出 Microsoft Word 中,也可以从 Microsoft Word 退出 (在文件菜单上,单击退出),并注意退出通知。

您可能会注意到永远不会触发启动事件。这是因为它激发前就设置好了。请注意有真正理由处理此事件,因为该应用程序必须已启动之前,您可以调用并设置自动化方法和属性。

Microsoft Excel 支持很多有趣和有益的事件,并且您可以按照下面的步骤来捕获它们。但是,有一些事项需要记住:

使用 Microsoft Visual C++ 5.0,若要查看您感兴趣的服务器的类型库,OLE/COM 对象查看器。若要查找事件,可打开的 coclass 声明 (通常在树的底部) ;将列出每个 coclass 的相关的事件。当您单击的事件接口,您可以看到哪些事件有、 其 Dispid,和它们在右边的视图中的声明方式。

没有必要修改的 Dispid 的我们在我们的 MyEventSink 类中的方法,因为 Microsoft Word 的应用程序事件、 Startup()、 Quit() 和 DocumentChange() 分别有 1、 2 和 3 的 Dispid。如果您按顺序创建这些方法,不需要对它们进行匹配的类型库,因为类向导启动 DISPID 1 处修改。但是,大多数的事件例如 Microsoft Excel 工作簿事件,不以 DISPID 1 开头。在这种情况下,必须显式修改调度映射中 MyEventSink.cpp,若要匹配的正确方法的 Dispid。

您应该是在安装之前已经装了office7或者office10等等,它和vc6.0有一个文件时冲突的!

若是这样的话:解决办法如下:贺激滑第一步:先卸载你电脑上的office产铅弊品;第二步:安装vc6.0第三步:安装office产品;至于什么原因我禅腊就不解释了!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12445638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存