手动添加消息响应

合集下载

MFC高级编程学习笔记

MFC高级编程学习笔记

No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。

SOAP消息解析及调试技巧

SOAP消息解析及调试技巧

SOAP消息解析及调试技巧SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在网络上进行分布式计算和交互。

它通过定义消息的格式和传输规范,实现了不同应用和平台之间的通信。

在开发和调试过程中,理解SOAP消息的结构和解析技巧是非常重要的。

本文将介绍SOAP消息的解析原理,并提供一些调试技巧,帮助开发者更好地处理SOAP 消息。

一、SOAP消息的结构SOAP消息通常由以下几个部分组成:1. Envelope(信封):SOAP消息的根元素,包含了所有SOAP消息的内容。

它定义了命名空间和编码方式。

2. Header(头):可选的部分,用于传递与消息相关的元数据和处理指令。

例如,可以通过头部添加认证信息、事务处理或其他自定义功能。

3. Body(身体):包含具体的消息内容,用于传递请求或响应的数据。

应用程序通常关注的是这个部分。

4. Fault(故障):可选的部分,用于表示消息处理过程中的错误或异常情况。

当请求或响应发生错误时,Fault部分可以提供详细的错误信息。

二、解析SOAP消息解析SOAP消息有多种方式,包括使用第三方库、手动解析XML 等。

下面以使用Java的SAAJ(SOAP with Attachments API for Java)库为例,介绍一种常用的解析SOAP消息的方法。

1. 导入SAAJ库:在Java项目中,需要导入SAAJ库才能使用其提供的API。

可以在项目的构建工具(如Maven或Gradle)中添加SAAJ 的依赖项,或手动导入相关的JAR包。

2. 创建SOAP消息对象:使用SAAJ提供的API,我们可以轻松地创建表示SOAP消息的对象。

```javaMessageFactory factory = MessageFactory.newInstance();SOAPMessage message = factory.createMessage();```3. 解析SOAP消息:通过解析得到的SOAP消息对象,我们可以提取出消息的各个部分。

MFC 对话框 背景图片 以及消除 字体重影 字体重叠

MFC 对话框 背景图片 以及消除 字体重影 字体重叠

很多人都想改变对话框的背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。

只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于该消息不能用MFC ClassWizard添加,因为ClassWizard 没有该消息添加的选项,我们需要手动添加,只需要在消息响应MAP添加一下ON_WM_ERASEBKGND(),如下所示:BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)//{{AFX_MSG_MAP(CSerialTestDlg)ON_WM_ERASEBKGND()//添加重绘背景消息响应//}}AFX_MSG_MAPEND_MESSAGE_MAP()我们然后进行消息响应,添加消息响应函数,然后在对话框类的声明文件添加该函数的声明virtual BOOL OnEraseBkgnd(CDC*pDC);在实现文件中进行该函数的书写,如:BOOL CSerialTestDlg::OnEraseBkgnd(CDC*pDC){CBitmap m_bitmap;m_bitmap.LoadBitmap(IDB_DLGBK);//加载背景图片,选择你对应的图片IDCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&m_bitmap);CRect rect;GetWindowRect(&rect);ScreenToClient(&rect);//选择客户区域BITMAP bmp;m_bitmap.GetBitmap(&bmp);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmW idth,bmp.bmHeight,SRCCOPY);//绘制BMP背景图m_bitmap.DeleteObject();return TRUE;}但是这样做一般就可以,细心的人会发现字体有重叠,比如说静态文本框和EDIT控件,如果选择只读模式,作为输出,这时EDIT的背景是BMP背景图片,但是字体重叠,如下图,我这样就行消除。

MFC 单文档中动态添加菜单项和响应菜单事件

MFC 单文档中动态添加菜单项和响应菜单事件

MFC 单文档中动态添加菜单项和响应菜单事件新建一个单文档程序在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏#define ID_NEWMENU WM_USER+101操作工具栏和状态栏使用GetDescendantWindow函数获取工具栏和状态栏的指针为ID_HIDE添加消息映射,编辑代码如下static bool m_Hide=false;m_Hide=!m_Hide;//获取工具栏指针CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);//获取状态栏指针CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);CMenu* pMenu=GetMenu();CMenu* pSubMenu=pMenu->GetSubMenu(2);if(m_Hide){pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE);}else{pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW);}动态添加子菜单为ID_NEWMENU增加消息映射,编辑代码如下static UINT m_NewMenu=ID_NEWMENU+1;//获取菜单CMenu* pMenu=GetMenu();//获取索引为2的菜单项,即第3列菜单CMenu* pSubMenu=pMenu->GetSubMenu(2);char buffer[1];itoa(m_NewMenu-ID_NEWMENU,buffer,10);if(m_NewMenu<=ID_NEWMENU+5){pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,CString("新的菜单")+buffer);}//如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的//消息映射表是否有这个弹出菜单中每个菜单项的处理函数,澳门新濠天地官网 如果没有就会把那一项改为灰的m_bAutoMenuEnable=false;添加OnCommand的消息映射用来响应添加的子菜单项,代码如下UINT uMsg=LOWORD(wParam);for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)if(uMsg==i){char buffer[1];itoa(i-ID_NEWMENU,buffer,10);MessageBox(CString("新的菜单") + buffer);}右键菜单在View类中添加OnRButtonDown的消息映射,代码如下CMenu pPopMenu;pPopMenu.CreatePopupMenu();if(pPopMenu==NULL);pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");this->ClientToScreen(&point);pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);在View类中添加OnCommand的消息映射用来响应右键菜单的事件UINT uMsg=LOWORD(wParam);if(uMsg==ID_NEWMENU+6)MessageBox(CString("右键菜单"));。

Windows常用控件介绍

Windows常用控件介绍
第5章 常用控件介绍
控件是Windows应用程序的图形界面的重 要组成部分,用户可以通过控件完成与应 用程序的交互。控件其实在MFC中是对数 据和方法的封装,当然控件就有自己的属 性和方法。在MFC中,所有的控件都是由 CWnd类派生来的,所以控件可以作为对 话框的子窗口而创建。本章以对话框程序 为基础介绍一些基本和常用的控件,学习 掌握Windows控件一般的使用方法和步骤。
2、列表框控件常用方法
为列表框关联一个控件类型的变量,可以
利用这个变量来调用列表框控件类CList
Box里面的方法。
列表框类 CListBox方法
描述
AddString()eteString() 从列表框中删除一个字符串
GetCurse()
返回选中字符串的索引
GetText()
5.1 Button按钮
• Button按钮是在Windows应用程序中最 常见的控件之一。如确定、取消、QQ 登录,Button按钮无处不在。这一节中 主要介绍Button按钮的添加,利用其控 件变量和消息响应函数来完成应用程 序的操作。
5.1.1 创建一个“打开”按钮
• 利用第4章所述方法,创建一个项目名 为Test1的对话框应用程序。为对话框 拖一个ID为IDC_BUTTON_OPEN, Caption为“打开”的Button按钮。同时删 除对话框中间的静态文本“TODO: 在这 里设置对话框控制”。
最后的程序要实现,初始状态“打开”按钮可用,“关闭”按钮 不可用。单击“打开”按钮弹出对话框提示“以打开”,之后 “打开”按钮不可用。单击“关闭”按钮,弹出对话框提示“已 关闭”,恢复初始状态。
1、定义一个BOOL型标记变量 因为程序要实现关闭打开轮流操作,所以需要一个变量标 记当前状态是打开还是关闭。我们选择BOOL变量来表示, TRUE为“打开”可用,FALSE为“关闭”可用。下面在对话框类 声明中定义一个名为m_bOpen的BOOL型变量,并在构造 函数中初始化为TRUE。代码如下:

关于VC++中两种自定义消息的发送与接收的方法实现进行说明

关于VC++中两种自定义消息的发送与接收的方法实现进行说明

在MFC中添加用户自定义消息首先弄清楚两点:(1)谁要发送这个消息(2)谁要接受这个消息。

用一个简单的例子来说明。

对象A向B(也可以就是A到A)发送消息。

1 发送消息首先在A的头文件中定义这个消息:#define WM_USERMESSAGE WM_USER+30所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的。

A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。

2 接受消息对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏;以及该消息的处理函数的具体实现。

2.1 头文件中加上自定义消息的处理函数原型在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );对Win32来说,wParam, lParam是传递消息最常用的手段。

2.2 在实现文件中加上接受消息映射的宏在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加如下形式的代码:ON_MESSAGE(WM_USERMESSAGE, OnProcName)上面是不用分号结尾的。

2.3 在实现文件中给出消息处理函数的具体实现。

发信人: Amia (小羊·橘子·和中南海有缘), 信区: VisualC标题: MFC中自由使用自定义消息发信站: 哈工大紫丁香(2003年11月26日07:45:34 星期三), 站内信件消息映射、循环机制是Windows程序运行的基本方式。

V C++MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。

消息的种类

消息的种类

4.5 MFC 消息映射机制在MFC中,对消息的处理是采用消息映射机制,本节就将对消息及MFC的消息映射机制做一个深入的讲解。

4.5.1 消息的种类在WINDOWS 程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息,下面就向您介绍在WINDOWS 程序设计中最常用的一些消息:1.键盘消息z WM_CHAR,该消息的处理函数OnChar()z WM_KEYDOWN,用户按下一个非系统键z WM_KEYUP,在非系统键被释放时产生这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN 消息,释放按键的时候又回产生WM_KEYUP 消息,所以WM_KEYDOWN 与WM_KEYUP 消息一般总是成对出现的,至于WM_CHAR 消息,是在用户的键盘输入能产生有效的ASCII 码时才会发生。

这里特别提醒要注意前两个消息与WM_CHAR 消息在使用上是有区别的。

在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。

而伴随WM_CHAR消息的参数是所按的键的ASCII 码,ASCII 码是可以区分字母的大小写的。

而虚拟键码是不能区分大小写的。

三种消息原型分别如下:afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);2.鼠标消息z WM_MOUSEMOVE,用户将鼠标移进窗口或在窗口中移动z WM_LBUTTONDOWN,用户按下左键z WM_LBUTTONUP,用户释放左键z WM_LBUTTONDBCLICK,用户双击左键z WM_RBUTTONDOWN,用户按下右键z WM_RBUTTONUP,用户释放右键z WM_RBUTTONDBCLICK,用户双击右键这组消息是与鼠标输入相关的,WM_MOUSEMOVE 消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件,要指出的是WINDOWS 系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE 消息,这一点要特别注意。

菜单以及与菜单相关联的操作

菜单以及与菜单相关联的操作

菜单的结构
300 301
主任室
3 楼 层 2 1
302
303
304
0 0 1 房间 2
3பைடு நூலகம்
4
获取菜单栏
菜单栏是属于框架的,在框架类中可以通过GetMenu
方法去得到菜单栏。
CMenu类提供了函数对菜单进行操作。
GetSubMenu可以获取一个子菜单。
GetMenu和GetSubMenu都是返回指向菜单的指针,但 前者是返回指向菜单栏的指针,而后者返回指向子 菜单的指针。
命令更新
菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消 息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其 创建一个CCmdUI对象。
可以通过手工或利用ClassWizard在消息映射中添加 ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI 消息。
对插入的菜单项Hello进行菜单的响应
动态创建的菜单如何去添加菜单消息响应函数,当然
手动去添加。我们借助ClassWizard为一个类去添加一个菜单 响应的命令消息的方法,然后照猫画虎去填写。
(1)在头文件中声明函数原型。
afx_msg void OnHello();
(2)对于命令消息,用ONCOMMAND宏来响应的。 在源文件中ON_COMMAND(111,OnHello) (3)函数本身,在源文件中 void CMainFrame::OnHello() { MessageBox("Hello!"); }
• 通告消息
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类 消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也 是以WM_COMMAND形式呈现。 从CCmdTarget派生的类,都可以接收到这类消息。

单片机通讯协议(非常经典)

单片机通讯协议(非常经典)
单片机通信协议 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其 中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法, 包括上位机端和下位机端等。 1.自定义数据通信协议
这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我 们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软 件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全 部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据 。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部 分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。
以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断 中进行。数据包的格式如下:
0x55, 0xAA, 0x7E, 0x12, 0xF0, 0x02, 0x23, 0x45, SUM, XOR, 0x0D
其中0x55,
0xAA,
0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据
} else if(state_machine == 10) {
if(0x0D == rcvdat) // 判断是否接收到帧尾结束符 {
retval = 0xaa; // 置标志,表示一个数据包接收到 } state_machine = 0; // 复位状态机 }
此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节 处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据 包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据 已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的 标志位来进行协议的解析处理。

Burp Suite使用介绍

Burp Suite使用介绍
https
1.以管理员权限运行ie浏览器 2.像http那样配置好代理 3.在地址栏访问https 地址,单击继续 4.点击错误证书在这个地址栏 5.点击查看证书 6.在证书路径选项卡点击PortSwigger CA,然后再点击查看证书 7.在常规选项卡里点击安装证书 8.在证书导入向导中,选择“将所有的证书放入下列存储区” 9.点击浏览 10.以当前用户或者本机计算机都可以
Highlight 为请求或响Байду номын сангаас添加颜色,可以在history选项卡和截获中更容易发现。
History 代理历史认为每个请求和响应。通过代理可以记录全部请求和响应。您可以过滤和注释这个信息来帮助管理它,并使用代 理的历史来测试流程。History(代理历史)总在更新,即使你把Interception turned off(拦截关闭),允许浏览不中断的同 时还监测应用流量的关键细节。 History Table 表中显示已通过代理HTTP消息的所有请求,并且可以查看完整的你所做的任何修改和截获的信息的请求和响应。 表中包 含以下字段: # (请求索引号)、Host(主机)、Method(请求方式)、URL(请求地址)、Params(参数)、Edited(编 辑)、Status(状态)、Length(响应字节长度)、MIME type(响应的MLME类型)、Extension(地址文件扩展 名) 、Title( 页面标题) 、Comment( 注释) 、SSL 、IP( 目标IP地址) 、Cookies、Time( 发出请求时间) 、Listener port( 监听端口) 。
wizard
恢复状态
Remember
setting
恢复默认
Intruder
开始攻击(爆 破)

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景一、实现过程1.表头修改新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下:LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam ){LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;RECT *prc = hdl.prc;WINDOWPOS *pwpos = hdl.pwpos;int nHeight = (int)(pwpos->cy * m_Height); //改变高度,m_Height为倍数pwpos->cy = nHeight;prc->top = nHeight;return lResult;}2. 表的修改新建一个MFC类CListCtrlCl,其基类为CListCtrl,定义一个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为自绘模式,然后子类化表头,代码如下:void CListCtrlCl::PreSubclassWindow(){// TODO: 在此添加专用代码和/或调用基类ModifyStyle(0,LVS_OWNERDRAWFIXED);CListCtrl::PreSubclassWindow();CHeaderCtrl *pHeader = GetHeaderCtrl();m_Header.SubclassWindow(pHeader->GetSafeHwnd());}添加成员变量,保存一些基本信息。

hutool soapclient 参数 前缀 -回复

hutool soapclient 参数 前缀 -回复

hutool soapclient 参数前缀-回复Hutool是一个面向Java开发者的工具库,提供了丰富的工具方法,便于开发者进行快速开发。

其中,Hutool的SoapClient工具提供了便捷的SOAP请求和响应操作,避免了繁琐的SOAP协议处理过程。

本文将以“hutool soapclient 参数前缀”为主题,以详细的步骤回答相关问题,帮助读者了解如何使用Hutool的SoapClient工具。

首先,我们来了解一下SOAP的概念。

SOAP(Simple Object Access Protocol)是一种用于交换结构化信息的通信协议,常用于Web服务中。

它使用XML格式进行数据交换,可以在HTTP、SMTP等传输协议上运行。

Hutool的SoapClient工具正是为了简化开发者对SOAP协议的操作而设计的。

下面,我们将一步一步介绍如何使用Hutool的SoapClient 工具。

第一步:添加Hutool依赖首先,在你的Java项目中添加Hutool的依赖。

可以通过Maven或在项目构建文件中手动添加依赖项。

xml<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.8</version></dependency>第二步:创建SoapClient对象接下来,我们需要创建一个SoapClient的实例对象。

可以使用如下代码创建一个默认的SoapClient对象:javaSoapClient client = SoapClient.create("在上述代码中,我们通过使用`create`方法创建了一个SoapClient对象,并指定了要请求的SOAP服务的URL。

第三步:设置参数前缀在使用Hutool的SoapClient工具发送请求之前,我们可以设置参数的前缀,以便在生成请求XML时使用。

WM_DEVICECHANGE

WM_DEVICECHANGE

==========================================(一)、WM_DEVICECHANGE 消息的接收解决方法:一般WM_DEVICECHANGE只发给顶层窗口。

你可以自己创建一个隐藏的顶层窗口来接收这个消息。

在没有顶层窗口时,如OCX里或子窗体里,经过我测试,使用RegisterDeviceNotification后,便可以接受到(所设置的GUID设备的)消息了。

==========================================(二)、在VC6中,一般要手动添加这个消息的映射代码,分三步,过程如下:第1步:在窗口类的.h文件中增加:.........afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);DECLARE_MESSAGE_MAP()第2步:在窗口类的.cpp文件中增加:ON_WM_DEVICECHANGE()END_MESSAGE_MAP()第3步:在窗口类的.cpp文件中增加:BOOL CClassCtrl::OnDeviceChange(UINT nEventType, DWORD dwData){return (TRUE); // 返回TRUE表示不拒绝此操作}==========================================(三)在OnDeviceChange的参数中的nEventType,为如下状态定义:#define DBT_DEVICEARRIVAL 0x8000 // system detected a new device#define DBT_DEVICEQUERYREMOVE 0x8001 // wants to remove, may fail#define DBT_DEVICEQUERYREMOVEFAILED 0x8002 // removal aborted#define DBT_DEVICEREMOVEPENDING 0x8003 // about to remove, still avail.#define DBT_DEVICEREMOVECOMPLETE 0x8004 // device is gone#define DBT_DEVICETYPESPECIFIC 0x8005 // type specific event#if(WINVER >= 0x040A)#define DBT_CUSTOMEVENT 0x8006 // user-defined event#endif /* WINVER >= 0x040A */#define DBT_DEVTYP_DEVICEINTERFACE 0x00000005#define DBT_DEVTYP_HANDLE 0x00000006#define DBT_DEVTYP_OEM 0x00000000#define DBT_DEVTYP_PORT 0x00000003#define DBT_DEVTYP_VOLUME 0x00000002==========================================(四)在OnDeviceChange的参数中的dwData,一般为如下状态定义:PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)dwData;if(pHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE){PDEV_BROADCAST_DEVICEINTERFACE pInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr; // pInf指向设备相关的信息结构体,参见以下节中的定义}==========================================(五)由WM_DEVICECHANGE可以获取设备的GUID及设备名(可能含有VID-PID及SN值)typedef struct _DEV_BROADCAST_HDR {DWORD dbch_size;DWORD dbch_devicetype;DWORD dbch_reserved;} DEV_BROADCAST_HDR, *PDEV_BROADCAST_HDR;typedef struct _DEV_BROADCAST_DEVICEINTERFACE_A {DWORD dbcc_size;DWORD dbcc_devicetype;DWORD dbcc_reserved;GUID dbcc_classguid;char dbcc_name[1];} DEV_BROADCAST_DEVICEINTERFACE_A, *PDEV_BROADCAST_DEVICEINTERFACE_A;dbcc_classguid 类似于:{A5DCBF10-6530-11D2-901F-00C04FB951ED}dbcc_name 类似于:\\?\USB#Vid_0c45&Pid_62f1#5&2b0c8088&0&4#{a5dcbf10-6530-11d2-901f-00c04fb951ed}==========================================(六)下面是一些常用的设备的class的GUID举例:// 65E8773D-8F56-11D0-A3B9-00A0C9223196OUR_GUID_ENTRY(AM_KSCATEGORY_CAPTURE, // 摄像头捕捉的class GUID0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)GUID usb_guid={0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED};GUID hid_guid={0x4D1E55B2,0xF16F,0x11CF,0x88,0xCB,0x00,0x11,0x11,0x00,0x00,0x30};USB Raw Device/USB设备{a5dcbf10-6530-11d2-901f-00c04fb951ed}Disk Device/磁盘设备{53f56307-b6bf-11d0-94f2-00a0c91efb8b}Network Card/网卡{ad498944-762f-11d0-8dcb-00c04fc3358c}Human Interface Device (HID)/人机界面设备{4d1e55b2-f16f-11cf-88cb-001111000030}Palm/手持设备{784126bf-4190-11d4-b5c2-00c04f687a67}DEFINE_GUID(UsbClassGuid, 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); DEFINE_GUID(DiskClassGuid, 0x53F56307, 0xB6BF, 0x11D0, 0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B); DEFINE_GUID(CdRomClassGuid, 0x53F56308, 0xB6BF, 0x11D0, 0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B);==========================================(七)如何“注册”设备的classGUID对应的设备事件通知(WINVER 0x0500 方法):只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的参数都是0007.#include <Dbt.h>DEV_BROADCAST_DEVICEINTERFACE dbi;ZeroMemory(&dbi,sizeof(dbi));dbi.dbcc_size = sizeof(dbi);dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;dbi.dbcc_reserved = 0;dbi.dbcc_classguid = hid_guid;HDEVNOTIFY hDevNotify;hDevNotify = RegisterDeviceNotification(m_hWnd,&dbi, DEVICE_NOTIFY_WINDOW_HANDLE);if(!hDevNotify){int Err = GetLastError();printf("RegisterDeviceNotification failed: %lx.\n", Err);return (FALSE);}注意:在程序结束前,一定要记得反注册:UnregisterDeviceNotification(hDevNotify);因默认VC6的WINVER宏定义是<0x0500的,故在必要时,在StdAfx.h中添加:#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define WINVER 0x0500#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers==========================================(八)如何“注册”设备的classGUID对应的设备事件通知(动态加载-方法):// 注册设备通知事件,须与反注册成对儿使用PVOID RegistCapvNotice(HWND hWnd){if(!hWnd || !::IsWindow(hWnd)) return (NULL);HMODULE hModUser = GetModuleHandle(TEXT("user32.dll"));if(!hModUser) return (NULL);PRegistDevNotify fnReg = (PRegistDevNotify)GetProcAddress( \hModUser, TEXT("RegisterDeviceNotificationA"));if(!fnReg) return (NULL);STDEVINTRF dbci;ZeroMemory(&dbci, sizeof(STDEVINTRF));dbci.dbcc_size = sizeof(STDEVINTRF);dbci.dbcc_devicetype = 0x00000005;dbci.dbcc_classguid = AM_KSCATEGORY_CAPTURE;return (fnReg(hWnd, &dbci, 0x00000000));}// 取消注册设备通知(反注册),须与注册成对儿使用BOOL UnRegistCapvNotice(PVOID hHandle){if(!hHandle) return (TRUE);HMODULE hModUser = GetModuleHandle(TEXT("user32.dll"));if(!hModUser) return (FALSE);PUnRegistDevNotify fnUreg = (PUnRegistDevNotify)GetProcAddress( \hModUser, TEXT("UnregisterDeviceNotification"));if(!fnUreg) return (FALSE);return (fnUreg(hHandle));}注意:上述在注册的classguid为AM_KSCATEGORY_CAPTURE,视频捕捉设备,可按需更换。

MFC 调整窗口大小

MFC 调整窗口大小
if(::IsWindow(jiyuan.m_hWnd)) //如果对话框已经打开
{
jiyuan.ShowWindow(SW_SHOW); //显示对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
gongcha.DestroyWindow(); //销毁其他的对话框,在此,gongcha为其他对话框类的对象
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
GetClientRect(&m_rect); //获取对话框的大小
return TRUE; // return TRUE unless you set the focus to a control
}
else//(!::IsWindow(jiyuan.m_hWnd)) //如果对话框还未打开
{
jiyuan.Create(IDD_DIALOG1,this); //创建对话框
jiyuan.MoveWindow (0,0,950,680); //调整对话框的位置和大小
jiyuan.ShowWindow(SW_SHOW); //显示对话框
}
}
任务完成!
1.单文档窗体大小的设置。
在CxxxApp中的InitInstance中加入如下代码:
m_pMainWnd->SetWindowPos(NULL,0,0,950,680,SWP_NOMOVE); //此句为添加代码,用于改变窗体的大小
m_pMainWnd->ShowWindow(SW_SHOW);
2.1举例如下:

OnSysCommand函数

OnSysCommand函数
请您及时更换请请请您正在使用的模版将于2周后被下线请您及时更换
OnSysCommand函 数
void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
这个函数响应系统控制菜单的命令.(即左上角图标处)。
OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.
如果窗体是对话框,则:
void CDlgDataMenu::OnSysCommand(UINT nID, LPARAM lParam) { if(nID == SC_CLOSE) {
::SendMessage(AfxGetMainWnd()->m_hWnd, WM_CLOSE, 0, 0);//关闭主窗体(线程),结束进程 } else { CDialog::OnSysCommand(nID, lParam); } }
//{{AFX_MSG_MAP(CMainFrame) ON_WM_G_MAP END_MESSAGE_MAP() 3、然后编写OnSysCommand函数: void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { if(nID == SC_MINIMIZE) { ...... } else { CMDIFrameWnd::OnSysCommand(nID, lParam); } }
可以用来获取最大化最小化关闭的消息,并进行重写。

Burp-Suite-最详细教程使用手册

Burp-Suite-最详细教程使用手册

Burp-Suite-最详细教程-翻译版目录目录 (2)简介 (3)第一章Burp Suite工具箱 (3)第二章Burp Suite的使用 (3)第三章Burp Proxy Help (34)第四章Burp Spider Help (49)第五章Burp Scanner Help (55)第六章Burp Intruder Help (70)第七章Burp Repeater Help (94)第八章Session Handler Help (97)第九章Burp工具的集成(Integration with Burp tools) (108)简介什么是Burp Suite?Burp Suite是用于攻击web应用程序的集成平台。

它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。

所有的工具都共享一个能处理并显示HTTP消息,持久性,认证,代理,日志,警报的一个强大的可扩展的框架。

Burp Suite能高效率地与单个工具一起工作,例如:一个中心站点地图是用于汇总收集到的目标应用程序信息,并通过确定的范围来指导单个程序工作。

在一个工具处理HTTP请求和响应时,它可以选择调用其他任意的Burp工具。

例如,代理记录的请求可被Intruder用来构造一个自定义的自动攻击的准则,也可被Repeater用来手动攻击,也可被Scanner用来分析漏洞,或者被Spider(网络爬虫)用来自动搜索内容。

应用程序可以是”被动地”运行,而不是产生大量的自动请求。

Burp Proxy把所有通过的请求和响应解析为连接和形式,同时站点地图也相应地更新。

由于完全的控制了每一个请求,你就可以以一种非入侵的方式来探测敏感的应用程序。

当你浏览网页(这取决于定义的目标范围)时,通过自动扫描经过代理的请求就能发现安全漏洞。

IburpExtender是用来扩展Burp Suite和单个工具的功能。

一个工具处理的数据结果,可以被其他工具随意的使用,并产生相应的结果。

DuiLib消息机制剖析

DuiLib消息机制剖析

DuiLib消息机制剖析其消息处理架构较为灵活,基本上在消息能过滤到的地⽅,都给出了扩展接⼝。

看了DuiLib⼊门教程后,对消息机制的处理有些模糊,为了屏蔽Esc按键,都花了⼤半天的时间。

究其原因,是因为对DuiLib消息过滤不了解。

这篇教程,可能不适合刚刚接触DuiLib没两天的⼈看。

⾄少你应该看过⼀些代码,但可能没看懂,那么这篇⽂章可能会给你指点迷津。

Win32消息路由如下:1. 消息产⽣。

2. 系统将消息排列到其应该排放的线程消息队列中。

3. 线程中的消息循环调⽤GetMessage(or PeekMessage)获取消息。

4. 传送消息TranslateMessage and DispatchMessage to 窗⼝过程(Windows procedure)。

5. 在窗⼝过程⾥进⾏消息处理我们看到消息经过⼏个步骤,DuiLib架构可以让你在某些步骤间进⾏消息过滤。

⾸先,第1、2和3步骤,DuiLib并不关⼼。

DuiLib对消息处理集中在CPaintManagerUI类中。

DuiLib在发送窗⼝过程前后进⾏了消息过滤。

DuiLib的消息渠,也就是所谓的消息循环在CPaintManagerUI::MessageLoop()或者CWindowWnd::ShowModal()中实现。

俩套代码的核⼼基本⼀致,以MessageLoop为例:voidCPaintManagerUI::MessageLoop(){MSGmsg = { 0 };while( ::GetMessage(&msg, NULL, 0, 0) ) {// CPaintManagerUI::TranslateMessage进⾏消息过滤if( !CPaintManagerUI::TranslateMessage(&msg) ) {::TranslateMessage(&msg);try{::DispatchMessage(&msg);} catch(...) {DUITRACE(_T("EXCEPTION: %s(%d)\n"), __FILET__, __LINE__);#ifdef_DEBUGthrow"CPaintManagerUI::MessageLoop";#endif}}}}3和4之间,DuiLib调⽤CPaintManagerUI::TranslateMessage做了过滤,类似MFC的PreTranlateMessage。

转--parsingerror:expected)解决方法

转--parsingerror:expected)解决方法

转--parsingerror:expected)解决⽅法VC6当我在界⾯上使⽤classwizard时,会弹出 Parsing error对话框,提⽰:Parsing error:Expected ") " inputline:“DDX_Check(pDX,IDC_CHECK0,m_bOutColumn[0]);”CSDN 解决,谢谢!问题解决!如下所⽰,⾃⼰⼿⼯添加的映射函数不要写到注释⾏中间。

添加到后⾯即可//{{AFX_DATA_INIT(CAssessweightPage)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INITDDX_Text(pDX, IDC_EDIT1, aifa[0]);DDX_Text(pDX, IDC_EDIT2, aifa[1]);DDX_Text(pDX, IDC_EDIT3, aifa[2]);DDX_Text(pDX, IDC_EDIT4, aifa[3]);DDX_Text(pDX, IDC_EDIT5, aifa[4]);MFC中有⼀种特殊的注释,叫注释宏。

注释宏⼀般由VC⾃动加⼊到你的代码中。

它是为class wizard服务的,class wizard通过它来定位各种系统⾃动添加代码的添加位置。

若要使⽤类向导添加成员变量和成员函数,则要保留注释宏;否则,必须⼿动添加。

如果你把它删了,classwizad就不能⾃动⽣成代码了。

你添加消息响应的时候是不是发现源代码⾥多了些代码??那些代码为什么会在那⾥出现?为什么不在别的⽂件⾥出现?就是因为那⾥有注释宏它要将代码⽣成在相应注释宏之间。

(这个注释是让ClassWizard能够分辨出哪些代码是它⽣成的,哪些是你⾃⼰写的。

你⾃⼰写的代码要在这个注释之外,这样ClassWizard再修改消息映射的时候就不会管你的代码了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

手动添加消息响应
Windows系统中的程序大部分都是通过消息和事件驱动的。

在windows下的应用程序主要工作是进行消息的循环处理,通过循环等待消息的到来和事件的发生,然后对不同的消息和事件运行相关的代码,完成相应的操作。

Windows提供了大量的消息,主要包括3种类型:标准消息、通知消息和命令消息。

当然也可以根据用户的需要自定义一些消息。

这些消息在MFC中有统一的处理框架,即消息映射机制。

消息映射机制将消息及其处理函数表示成一一对应的表,并对这张表进行分析处理。

总的来说,MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。

在消息映射表中,消息与对应的消息处理函数指针是成对出现的。

某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。

当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可以知道该类能否处理此消息。

如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。

无论时利用MFC向导还是手动添加消息处理时,都需要在源文件中增加三处代码:
1、在类的定义中添加消息处理成员函数的函数声明。

2、在类的消息映射表中加入相应的消息映射表项。

3、在类的实现中加入该消息处理成员函数的函数实现。

如果时自定义消息,则还需要在头文件中定义自定义消息的宏。

例如:要在ABC类中添加个自定义消息UM_AAA的处理,当消息产生的时候,响应OnAAA( )函数。

可以按照下面四个步骤来实现:
1、在头文件ABC.H中定义自定义消息的宏。

#define UM_AAA WM_USER+1
在windows系统中提供了大量的消息的同时可以给用户自定义消息提供了空间,我们在自定义消息的宏的时,只有选择WM_USER以上的数值就不会与系统提供的消息冲突了。

2、在头文件ABC.H中声明消息响应函数的OnAAA( )。

protected:
//{{AFX_MSG (ABC)
afx_msg void OnAAA( );
//}}AFX_MSG
DECLARE_MESSAGE_MAP( )
消息响应函数应该放在DECLARE_MESSAGE_MAP( )之前,AFX_MSG注释宏之间。

该函数声明前不有一个afx_msg限定符,这也是一个宏,这个宏表面这个函数是一个消息响应函数的声明。

3、进行消息映射
BEIGIN_MESSAGE_MAP(ABC)
//{{AFX_MSG_MAP(ABC)
ON_MESSAGE(UM_AAA, OnAAA)
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )
在END_MESSAGE_MAP( )之前的AFX_MSG_MAP注释宏之间用ON_MESSAGE( )将UM_AAA和OnAAA响应函数相关联起来。

4、在ABC.CPP中将消息响应函数的实现
void OnAAA( )
{……}
只有按照上面的4个步骤,就可以根据自己的需要,在系统程序中添加合适的消息和响应函数了。

相关文档
最新文档