如何从MFC应用程序中调用.NET框架
如何发送击键到其它应用程序?关于如何通过编程来发送 Ctrl+Alt+Del 击键?如何从 MFC 应用程序中调用 .NET 框架?我想编写一个应用程序,它能通过击键将信息写到另外一个应用程序的窗体中。
我是不是应该发送 WM_KEYDOWN 和 WM_KEYUP 消息?有没有更好的办法?发送WM_KEYDOWN 和 WM_KEYUP 消息也许能行得通,但 SendInput 是专门被设计用于此目的的 API 函数。
它通过 INPUT 结构数组参数来合成包括击键和鼠标事件在内的输入,每个 INPUT 结构数组元素对应一个输入事件——击键或鼠标动作。
INPUT 结构含有一个联合类型,其成员为 MOUSEINPUT,KEYBDINPUT (或 HARDWAREINPUT,仿真面包烤箱)。
对于击键来说其 KEYBDINPUT 结构如下:struct KEYBDINPUT {WORD wVk; // virt key codeWORD wScan; // hw scan codeDWORD dwFlags; // flags—see docDWORD time; // time stamp, 0 = dfltULONG_PTR dwExtraInfo; // app-defined};所以向另外一个应用程序发送击键其实就是建立一个 INPUT 数组,每一个数组元素对应一次击键(弹起和按下),然后调用 SendInput 函数。
为了示范其实际使用方法,我编写了一个叫 Typematic 的小程序,你只要按下一个热键,便可以快速将姓名、地址、电话号码或其它信息敲入窗体中。
这对于网上购物者们来说是件很理想的事情。
当你第一次运行 Typematic 时,显示的对话框如 Figure 1 所示:Figure 1 Typematic 的初始对话框按“OK”按钮后进入隐藏状态。
其后你可以按 +T 来重新激活 Typematic,显示如 Figure 2 所示的对话框:Figure 2 重新被激活得 Typematic此时可以看到对话框里显示出了一列缩写信息。
敲入“n”代表姓名,“a”代表地址,Typematic 发送相应的字符串到当前窗体或应用程序。
这些缩写信息定义在一个静态表中,你可以将它们改为自己的信息:struct ABBREV {TCHAR key;LPCTSTR text;} MYABBREVS[] = {{ _T(''n''),_T("Elmer Fudd") },{ _T(''a''),_T("1 Bunny Way") },{ 0,NULL}};当然,在实际开发过程中,你不必硬编码这些信息,你可以提供一个用户界面来定制它,并将其保存在用户配置文件中,以便这一台机器的每一个用户都有不同的设置。
Typematic 示范了一些其它的技巧:如何注册热键来激活你的应用程序(参见 2000 第十二期的专栏)以及如何让静态文本控件接受键盘输入(你必须处理 WM_GETDLGCODE 并返回DLGC_WANTCHARS )。
Typematic 定义了一个专门的静态文本控件 CStaticAbbrev,它既可以显示缩写信息也可以读取加速键。
代码如 Figure 3 所示。
当用户按下热键。
Typematic 便被唤醒并将焦点定位到该 CStaticAbbrev 控件,等待字符输入。
当 CStaticAbbrev::OnChar 获得一个与表中缩写之一匹配的键时,它便隐藏对话框,然后调用辅助函数 SendString 发送文本:// in CStaticAbbrev::OnCharif (/* find char in ABBREV table */) {GetParent()->ShowWindow(SW_HIDE); // hide dialogSendString(abbrev.text); // send text}当Typematic 将自己隐藏后,Windows 自动将焦点恢复到之前拥有焦点的窗口,这样输入便定下向到用户按热键之前焦点所在的窗口。
非常聪明,不是吗?如果你需要将输入定向到一个特定的应用程序或窗口,调用 SendInput 之前一定要确保它是活动的,为此可以调用 SetForegroundWindow 函数。
所有发送击键的工作都在 SendString 中进行,它建立 INPUT 数组并调用 SendInput (参见 Figure 3)。
SendString 发送一系列 KEYDOWN/KEYUP 的 INPUT 结构对,字符串中的每一个字符对应一双这样的结构表示按下/弹起。
它用 KEYEVENTF_UNICODE 标志将串作为 Unicode 字符发送。
Unicode 比较容易处理,因为你不必用 Shift 键合成大写字符。
如果不借助 KEYEVENTF_UNICODE 的话,你必须将大写的 E 发送成 后跟e,每个字符都有一次按下/弹起(down/up)事件, 共有四次击键。
感谢微软的人添加了 KEYEVENTF_UNICODE。
如果你用托管 C++ 或 Microsoft .NET 中其它的语言编程,发送击键更容易。
有一个框架类叫 SendKeys,其静态函数 Send 使得发送击键易如反掌。
你甚至可以用花哨的语法发送专用键。
例如用“{F1}{BACKSPACE}A”来发送 F1,Backspace,A。
为此我还写了.NET 版本的 Typematic,起名为:Typematic.NET,它使用 SendKeys。
这样 SendString 函数变成这样:#pragma managedvoid SendString(LPCTSTR str) {SendKeys::SendWait(str);}还有什么比这更容易呢?当我刚开始做的时候,我很自然地用 SendKeys::Send 尝试,而不是 SendWait。
为什么我要等待应用程序吃完这些键呢?唉,我尝试的时候 Typematic 惨烈地崩溃了,在 Windows.Forms.dll 的某个地方发生 System.InvalidOperationException 异常。
当我启动公共语言运行时(CLR)调试器察看缘由时,Output 窗口显示出下列信息:“附加信息:由于该应用程序不处理 Windows 消息,SendKeys 无法在该应用程序中运行。
要么让该应用程序处理消息,要么使用 SendKeys.SendWait 方法。
”这就是我所称得友好的出错信息!就让它成为所有人的一个例子...
MFC如何操作word和excel进行插入数据和打印
MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
文档类从CDocument类派生,用来管理数据,数据的变化、存取都是通过文档实现的。
视窗口通过文档对象来访问和更新数据。
给你介绍一本书 MFC教程 作者 :李久新
MFC读写Excel、word文件。
头文件中要定义过#define _UNICODE 这是最主要的,这样编译时会用 unicode 库。
class CString 使用 TCHAR data 类型, 本身就支持 unicode.程序里用 宏 _T 转换普通字符串 到 unicode程序里用 TCHAR 代替原来用的char.用LPTSTR 代替原来用的 char*用LPCTSTR 代替原来用的 const char*.
mfc建的一个文档,要按上面的保存按钮后保存文档,该怎么做?
TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||"); // 构造保存文件对话框 CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); CString strFilePath; CStdioFile file;CString a;GetDlgItemText(IDC_SAVE_EDIT,a);// 显示保存文件对话框 if (IDOK == fileDlg.DoModal()) { // 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里 strFilePath = fileDlg.GetPathName();file.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeText); file.WriteString(a); //写入edit box中的数据file.Close();//SetDlgItemText(IDC_SAVE_EDIT, strFilePath); } 我用的VS2010,你作为参考 吧!
用MFC怎么做串口测试程序,我要详细步聚!!!!!!!!
添加一个mscomm 控件里面有,然后设置它的波特率,波特率和下位机的波特率要一致。
然后就用Write和Read方法读写数据就行了。
推荐关于MSCOMM控件的一些说明 VB5.0/6.的MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。
但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和容易控制.特别是在中文Wln95/98下通信时更会出现问题。
下面就从基础开始介绍,然后逐步讨沦MSComm控件在编程中出现的问题以及编程技巧。
一、用MSComm控件通信1.串口通信基础知识 一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和皿信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性 描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
在该控件的对象库中也可以找到这些常量。
常量 值 描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。
在发送字符时,在系统指定的事1件内,CTS(Clear To Send)线是低电平ComEventDSRTO 1003 Data Set Ready Timeout。
在发送字符时,在系统指定的事件内,DSR(Data Set Ready)线是低电平ComEventFrame 1004 数据帧错误。
硬件检测到一个数据帧错误ComEventOverrun 1006 端口溢出。
硬件中的字符尚未读,下一个字符又到达,并且丢失ComEventCDTO 1007 Carrier Detect Time。
在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是低电平。
CD 也称为RLSD(Receive Line Singal Detect,接收线信号检测)ComEventRxOver 1008 接收缓冲区溢出。
在接收缓冲区中没有空间ComEventRxParity 1009 奇偶校验错。
硬件检测到奇偶校验错误7ComEventTxFull 1010 发送缓冲区满。
在对发送字符排队时,发送缓冲区满ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误通信事件包含了下面的设置:常量 值 描述ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低ComEvReceive 2 接收到了Rthreshold个字符。
持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS 3 CTS(Clear To Send)线改变ComEvDSR 4 DSR(Data Set Ready)线改变。
当DSR从1到0改变时,该事件发生ComEvCD 5 CD(Carrier Detect)线改变ComEvRing6检测到响铃信号。
一些URAT(Universal AsynchronousReciver- -Transmitters,通用异步收发器)不支持该事件ComEvEOF 7 收到了EOF字符(ASCII字符26)Error消息(MSComm控件)下表列出了MSComm控件可捕获的错误消息:常量 值 描述ComInvalidPropertyValue 380 无效的属性值ComSetNotSupported 383 属性只读ComGetNotSupported 394 属性只读ComPortOpen 8000 端口打开时该存在无效 8001 超时设置必须比0值大ComPortInvalid 8002 无效的端口号 8003 属性只在运行时有效 8004 属性在运行时是只读的ComPortAleadyOpen 8005 端口已经打开 8006 设备标识符无效或不支持 8007 不支持设备的波特率 8008 指定的字节大小无效 8009 缺省参数错误 8010 硬件不可用(被其他设备锁住) 8011 函数不能分配队列ComNoOpen 8012 设备没有打开 8013 设备已经打开 8014 不能使用通信通知ComSetCommStateFailed 8015 不能设置通信状态 8016 不能设置通信事件屏蔽ComPortNotOpen 8018 该存在只在端口打开是有效 8019 设备忙ComReadError 8020 通信设备读错误ComDCBError 8021 检取端口设备控制块时出现内部错误搞清楚以上基本属性后,就可以开始编写通信许程序了。
在VB5.0/6.0中新建一个工程文件。
添加Microsoft Comm Control 5.0组件,在简体Form1中加入Command命令按钮并取名为CmdTest,MSComm控件取名为MSComm1,加入如下程序代码。
Private Sub cmdTestClick ( ) '打开串口MSComml.CommPort =2 '设定Com2If MSComml.PortOpen = False ThenMSComm1....
vc++ 怎么做个表格
1、添加OLE/COM支持。
首先,应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。
本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。
通过查看源代码,可以知道在stdafx.h的头文件中,添加了OLE/COM很多类所需添加的头文件。
#include // MFC 自动化类同时,在应用程序类的InitInstance函数中,添加了OLE/COM的初始化代码,如下所示:// 初始化 OLE 库if (!AfxOleInit()){AfxMessageBox(IDP_OLE_INIT_FAILED);return FALSE;}2、导入并封装Excel中的接口Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。
VC可以通过导入这些接口,并通过接口来对Excel的操作。
由于本文只关心对Excel表格中的数据的读取,主要关注几个_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range等几个接口。
Excel的各类接口的属性、方法可以通过MSDN的Office Development进行查询。
VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择要导入的Excel类型库中的接口。
在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。
由于标准的C++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_和put_前缀分别实现对属性的读写操作。
即,由VC自动完成C++类对接口的封装。
MFC串口通信
展开全部 基本步骤(1)创建)一个 MFC 的程序工程。
注意:在VC中对WORD进行操作需要在MFC AppWizard - Step 2 of4中的Automaiton选项上打上勾。
(2)Ctrl+W 执行 ClassWizard(本文按照 VC6 操作,示例程序是在VC6 下编写测试的)。
(3)Add Class...\From a type Library... 在 Office目录中,找到想使用的类型库。
(我使用的是 Office2003,其Word 的类型库文件,保存在 E:\ProgramFiles\Microsoft Office\Office12\MSWOR.OLB)。
(4)选择类型库文件后,在弹出的对话窗中继续选择要添加的类。
具体选择什么类,要看你将来在程序中打算调用什么功能。
当然,也可以不用考虑这么多,用鼠标和Shift键配合,全部选择也可以。
(5)初始化COM。
方法一,找到App的InitInstance()函数,在其中添加AfxOleInit()函数的调用;方法二,在需要调用COM功能的地方 CoInitialize(NULL),调用完毕后CoUninitialize()。
(6)在你需要调用 Office 功能函数的 cpp 文件中 #include //为了方便操作 VARIANT 类型变量,使用 CComVariant 模板类 #include "文件名.h" //具体的头文件名,是由装载类型库的文件名决定的,如MSWORD。
示例程序:\//word应用程序 _Application app; //初始化连接 app.CreateDispatch("word.Application"); Documents doc; CComVarianta(_T(strWord)),b(false),c(0),d(true),aa(0),bb(1); _Document doc1; doc.AttachDispatch(app.GetDocuments()); doc1.AttachDispatch(doc.Add(&a,&b,&c,&d)); Range range; //求出文档的所选区域 range=doc1.GetContent();//取出文件内容 str=range.GetText(); m_richedit.SetWindowText(str); //关闭 app.Quit(&b,&c,&c); //释放环境 app.ReleaseDispatch();
转载请注明出处51数据库 » mfc word com接口