您当前的位置:首页 > 精选知识 > 正文

registerwindowmessage(RegisterWindowMessage 该函数怎么用)

本文目录

  • RegisterWindowMessage 该函数怎么用
  • VB任务栏气泡
  • 怎样使用RegisterWindowMessage注册消息
  • 在vfp中怎么根据IE窗口的HWND操作IE窗口对象
  • MFC dll怎样接收主窗口的消息
  • 易语言怎么知道什么功能该用什么API
  • WINDOWS消息处理过程
  • ON_REGISTERED_MESSAGE
  • 关于C#的Hook技术问题

RegisterWindowMessage 该函数怎么用

UINT RegisterWindowMessage(lpsz) 函数说明:RegisterWindowMessage函数定义一个新 的窗口消息,该消息保证在整个系统范围内是唯一的。 调用SendMessage或PostMessage函数时可以使用该 函数返回的消息值。 参数说明: lpsz 指向一个以NULL结束...

VB任务栏气泡

晕,刚才回答了,居然不合格。我只有把所有代码贴出来了。’系统托盘模块代码’*************************************************************************’**模 块 名:ShellNotifyIcon’**描 述:显示托盘提示模块’*************************************************************************Option Explicit’’’’’’’’’’先向系统注册TaskbarCreated消息’’’’’’’’’’WM_TASKBARCREATED = RegisterWindowMessage(“TaskbarCreated“);’’’’’’’’’’然後在WndProc函数里判断这个消息,是的话重建托盤就可以了。Declare Function SetForegroundWindow Lib “user32“ (ByVal hwnd As Long) As LongPrivate Declare Function SetWindowLong Lib “user32.dll“ Alias “SetWindowLongA“ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function CallWindowProc Lib “user32.dll“ Alias “CallWindowProcA“ (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Const WM_MOUSEISMOVING = &H200 ’在图标上移动鼠标Private Const WM_LBUTTONDOWN = &H201 ’鼠标左键按下Private Const WM_LBUTTONUP = &H202 ’鼠标左键释放Private Const WM_LBUTTONDBLCLK = &H203 ’双击鼠标左键Private Const WM_RBUTTONDOWN = &H204 ’鼠标右键按下Private Const WM_RBUTTONUP = &H205 ’鼠标右键释放Private Const WM_RBUTTONDBLCLK = &H206 ’双击鼠标右键Private Const WM_MBUTTONDOWN = &H207 ’鼠标右键按下Private Const WM_MBUTTONUP = &H208 ’鼠标右键释放Private Const WM_MBUTTONDBLCLK = &H209 ’双击鼠标右键Private Const WM_SETHOTKEY = &H32 ’响应您定义的热键Private Const WM_USER = &H400Private Const WM_NOTIFYICON = WM_USER + 1 ’ 自定义消息Private Const GWL_WNDPROC = (-4)’ 关于气球提示的自定义消息, 2000下不产生这些消息Private Const NIN_BALLOONSHOW = (WM_USER + &H2) ’ 当 Balloon Tips 弹出时执行Private Const NIN_BALLOONHIDE = (WM_USER + &H3) ’ 当 Balloon Tips 消失时执行(如 SysTrayIcon 被删除),’ 但指定的 TimeOut 时间到或鼠标点击 Balloon Tips 后的消失不发送此消息Private Const NIN_BALLOONTIMEOUT = (WM_USER + &H4) ’ 当 Balloon Tips 的 TimeOut 时间到时执行Private Const NIN_BALLOONUSERCLICK = (WM_USER + &H5) ’ 当鼠标点击 Balloon Tips 时执行。’ 注意:在XP下执行时 Balloon Tips 上有个关闭按钮,’ 如果鼠标点在按钮上将接收到 NIN_BALLOONTIMEOUT 消息。Private Declare Function Shell_NotifyIcon Lib “shell32.dll“ Alias “Shell_NotifyIconA“ (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As LongPrivate Declare Function RegisterWindowMessage Lib “user32“ Alias “RegisterWindowMessageA“ (ByVal lpString As String) As LongPrivate Type NOTIFYICONDATA cbSize As Long ’ 结构大小(字节) hwnd As Long ’ 处理消息的窗口的句柄 uId As Long ’ 唯一的标识符 uFlags As Long ’ Flags uCallBackMessage As Long ’ 处理消息的窗口接收的消息 hIcon As Long ’ 托盘图标句柄 szTip As String * 128 ’ Tooltip 提示文本 dwState As Long ’ 托盘图标状态 dwStateMask As Long ’ 状态掩码 szInfo As String * 256 ’ 气球提示文本 uTimeoutOrVersion As Long ’ 气球提示消失时间或版本 ’ uTimeout - 气球提示消失时间(单位:ms, 10000 -- 30000) ’ uVersion - 版本(0 for V4, 3 for V5) szInfoTitle As String * 64 ’ 气球提示标题 dwInfoFlags As Long ’ 气球提示图标End Type’ dwState to NOTIFYICONDATA structurePrivate Const NIS_HIDDEN = &H1 ’ 隐藏图标Private Const NIS_SHAREDICON = &H2 ’ 共享图标’ dwInfoFlags to NOTIFIICONDATA structure’Private Const NIIF_NONE = &H0 ’ 无图标’Private Const NIIF_INFO = &H1 ’ “消息“图标’Private Const NIIF_WARNING = &H2 ’ “警告“图标’Private Const NIIF_ERROR = &H3 ’ “错误“图标Public Enum NIIF_InfoFlag NIIF_NONE = &H0 ’ 无图标 NIIF_INFO = &H1 ’ “消息“图标 NIIF_WARNING = &H2 ’ “警告“图标 NIIF_ERROR = &H3 ’ “错误“图标End Enum’ uFlags to NOTIFYICONDATA structurePrivate Const NIF_MESSAGE As Long = &H1Private Const NIF_ICON As Long = &H2Private Const NIF_TIP As Long = &H4Private Const NIF_STATE As Long = &H8Private Const NIF_INFO As Long = &H10’ dwMessage to Shell_NotifyIconPrivate Const NIM_ADD As Long = &H0Private Const NIM_DELETE As Long = &H2Private Const NIM_MODIFY As Long = &H1Private Const NIM_SETFOCUS As Long = &H3Private Const lngNIM_SETVERSION As Long = &H4Private lngPreWndProc As LongPrivate lngMsgBarRester As LongPrivate OwerForm As Form Private IconData As NOTIFYICONDATA’是否显示Tip信息Private TipShowing As Boolean’--------------------------------------------------------------------------------’*************************************************************************’**函 数 名:AddNotifyIcon’**输 入:frm(Form) - 窗体’** :strTitle(String) - 托盘提示标题’** :strInfo(String) - 托盘提示信息’** :Optional lngType(Long = 1) - 托盘提示类型 0 无 1 信息 2 警告 3 错误’** :Optional lngTime(Long = 10000) - 停留时间’**输 出:无’**功能描述:显示托盘图标提示信息Public Sub AddNotifyIcon(frm As Form, strTitle As String, strInfo As String, Optional bTipMessage As Boolean = False, Optional lngType As NIIF_InfoFlag = NIIF_INFO, Optional lngTime As Long = -1) ’ 向托盘区添加图标 Set OwerForm = frm With IconData .cbSize = Len(IconData) .hwnd = OwerForm.hwnd .uId = 0 .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE If bTipMessage Then .uFlags = .uFlags Or NIF_INFO Or NIF_STATE .uCallBackMessage = WM_NOTIFYICON .szTip = strTitle & vbNullChar .hIcon = OwerForm.Icon.Handle .dwState = 0 .dwStateMask = 0 .szInfo = strInfo & vbNullChar .szInfoTitle = strTitle & vbNullChar .dwInfoFlags = lngType .uTimeoutOrVersion = lngTime End With If lngPreWndProc = 0 Then ’没有初始化 Shell_NotifyIcon NIM_ADD, IconData lngMsgBarRester = RegisterWindowMessage(“TaskBarCreated“) lngPreWndProc = SetWindowLong(OwerForm.hwnd, GWL_WNDPROC, AddressOf NotifyIconWindowProc) Else ’已初始化 Shell_NotifyIcon NIM_MODIFY, IconData End IfEnd Sub’*************************************************************************’**函 数 名:DeleteNotifyIcon’**输 出:无’**功能描述:删除托盘图标Public Sub DeleteNotifyIcon() If lngPreWndProc 《》 0 Then ’ 删除托盘区图标 With IconData .cbSize = Len(IconData) .hwnd = OwerForm.hwnd .uId = 0 .uFlags = NIF_TIP Or NIF_ICON Or NIF_MESSAGE .uCallBackMessage = WM_NOTIFYICON .szTip = ““ .hIcon = OwerForm.Icon.Handle End With Shell_NotifyIcon NIM_DELETE, IconData SetWindowLong OwerForm.hwnd, GWL_WNDPROC, lngPreWndProc lngPreWndProc = 0 End IfEnd Sub’*************************************************************************’**函 数 名:NotifyIconWindowProc’**输 入:ByVal hwnd(Long) -’** :ByVal msg(Long) -’** :ByVal wParam(Long) -’** :ByVal lParam(Long) -’**输 出:(Long) -’**功能描述:frmTest 窗口入口函数’*************************************************************************Function NotifyIconWindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ’ 拦截 WM_NOTIFYICON 消息 If msg = WM_NOTIFYICON Then Select Case lParam Case WM_LBUTTONUP Debug.Print “左键单击“ Case WM_LBUTTONDBLCLK Debug.Print “左键双击“ Case WM_RBUTTONUP Debug.Print “右键单击“ Case WM_RBUTTONDBLCLK Debug.Print “右键双击“ Case WM_MBUTTONUP Debug.Print “中键单击“ Case WM_MBUTTONDBLCLK Debug.Print “中键双击“ Case NIN_BALLOONSHOW Debug.Print “显示气球提示“ TipShowing = True Case NIN_BALLOONHIDE Debug.Print “删除托盘图标“ TipShowing = False Case NIN_BALLOONTIMEOUT Debug.Print “气球提示消失“ TipShowing = False Case NIN_BALLOONUSERCLICK Debug.Print “单击气球提示“ TipShowing = False Case WM_MOUSEISMOVING ’Debug.Print “鼠标移动“ Case Else Debug.Print lParam End Select ElseIf msg = lngMsgBarRester Then AddNotifyIcon OwerForm, IconData.szInfoTitle, IconData.szInfo End If NotifyIconWindowProc = CallWindowProc(lngPreWndProc, hwnd, msg, wParam, lParam)End Function’*************************************************************************’**函 数 名:ShowTrayTipMessage’**输 出:无’**功能描述:设置新的标题Public Sub ShowTrayTipMessage(strTitle As String, strInfo As String, Optional lngType As NIIF_InfoFlag = NIIF_INFO, Optional lngTime As Long = -1) With IconData .uFlags = .uFlags Or NIF_INFO Or NIF_STATE .szInfo = strInfo & vbNullChar .szInfoTitle = strTitle & vbNullChar .dwInfoFlags = lngType .uTimeoutOrVersion = lngTime End With Shell_NotifyIcon NIM_MODIFY, IconDataEnd Sub’*************************************************************************’**函 数 名:SetTrayTip’**输 出:无’**功能描述:设置新的标题Public Sub SetTrayTip(tip As String) With IconData .szTip = tip & vbNullChar .uFlags = NIF_TIP End With Shell_NotifyIcon NIM_MODIFY, IconDataEnd Sub’*************************************************************************’**函 数 名:SetTrayIcon’**输 出:无’**功能描述:设置新的图标Public Sub SetTrayIcon(pic As Picture) If pic.Type 《》 vbPicTypeIcon Then Exit Sub With IconData .hIcon = pic.Handle .uFlags = NIF_ICON End With Shell_NotifyIcon NIM_MODIFY, IconDataEnd Sub

怎样使用RegisterWindowMessage注册消息

UINTRegisterWindowMessage(lpsz)函数说明:RegisterWindowMessage函数定义一个新的窗口消息,该消息保证在整个系统范围内是唯一的。调用SendMessage或PostMessage函数时可以使用该函数返回的消息值。参数说明:lpsz  指向一个以NULL结束的字符串,该字符串指定待登记的消息。返回值:若成功地登记了消息,返回值是一个消息标识符。该标识符值的范围在0XC000到0XFFFF之间,否则,返回值为0。注释:RegisterWindowMessage函数通常用于为两个合作应用程序之间的通信登记消息。  若两个不同的应用程序登记了相同的消息字符串,则这两个应用程序返回相同的消息值。该消息一直维持被登记状态,直到Windows会话结束。当多个应用程序必须处理同一消息时才使用RegisterWindowMessage函数。在一个窗口类范围内发送私有消息时,应用程序可使用范围在WM_USER到0X7FFF之间的任意整数。1.ControlAtomString:=Format(’ControlOfs%.8X%.8X’,[GetModuleHandle(nil),GetWindowThreadProcessID(Handle,OwningProcess)]);ControlOfs%.8X%.8X,是一个Format的表达式,里面的%.8x%.8x好像是8位16进制;2.参考上文;3.目标窗体要自定义一个处理RM_GetObjectInstance消息的过程;

在vfp中怎么根据IE窗口的HWND操作IE窗口对象

不知道你传入的窗口句柄是在哪一层如果是 internet explorer_server 这个类窗口的句柄,用下面的代码:vb code*-- vfp9 代码function getobjfromhwnd(tnhwnd)local nmsg, nres, oretdeclare long registerwindowmessage in win32api stringdeclare long sendmessagetimeout in win32api long, long, long, long, long, long, long @declare long objectfromlresult in oleacc long, string, long, object @oret = nullnmsg = registerwindowmessage(’wm_html_getobject’)nres = 0sendmessagetimeout(tnhwnd, nmsg, 0, 0, 2, 1000, @ nres)if nres 》 0objectfromlresult(nres, 0h30c56f621ea4cf11a73100a0c9082637, 0, @ oret)endifreturn oretendfunc

MFC dll怎样接收主窗口的消息

第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam){// TODO: 处理用户自定义消息...return 0;}第三步:在类头文件的AFX_MSG块中说明消息处理函数:class CMainFrame:public CMDIFrameWnd{...// 一般消息映射函数protected:// {{AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);//}}AFX_MSGDECLARE_MESSAGE_MAP()}第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_TIMER()ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)//}}AFX_MSG_MAPEND_MESSAGE_MAP()如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。

易语言怎么知道什么功能该用什么API

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作 DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区 FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveType 判断一个磁盘驱动器的类型 GetExpandedName 取得一个压缩文件的全名 GetFileAttributes 判断指定文件的属性 GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 GetFileSize 判断文件长度 GetFileTime 取得指定文件的时间信息 GetFileType 在给出文件句柄的前提下,判断文件类型 GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息 GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区 GetFullPathName 获取指定文件的完整路径名 GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径 GetOverlappedResult 判断一个重叠操作当前的状态 GetPrivateProfileInt 为初始化文件(.ini文件)中指定的条目获取一个整数值 GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一个列表 GetPrivateProfileString 为初始化文件中指定的条目取得字串 GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值 GetProfileSection 获取指定小节(在win.ini文件中)所有项名和值的一个列表 GetProfileString 为win.ini初始化文件中指定的条目取得字串 GetShortPathName 获取指定文件的短路径名 GetSystemDirectory 取得Windows系统目录(即System目录)的完整路径名 GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用 GetTempPath 获取为临时文件指定的路径 GetVolumeInformation 获取与一个磁盘卷有关的信息 GetWindowsDirectory 获取Windows目录的完整路径名 hread 参考lread hwrite 参考lwrite函数 lclose 关闭指定的文件 lcreat 创建一个文件 llseek 设置文件中进行读写的当前位置 LockFile 锁定文件的某一部分,使其不与其他应用程序共享 LockFileEx 与LockFile相似,只是它提供了更多的功能 lopen 以二进制模式打开指定的文件 lread 将文件中的数据读入内存缓冲区 lwrite 将数据从内存缓冲区写入一个文件 LZClose 关闭由LZOpenFile 或 LZInit函数打开的一个文件 LZCopy 复制一个文件 LZInit 这个函数用于初始化内部缓冲区 LZOpenFile 该函数能执行大量不同的文件处理,而且兼容于压缩文件 LZRead 将数据从文件读入内存缓冲区 LZSeek 设置一个文件中进行读写的当前位置 MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间 MoveFile 移动文件 OpenFile 这个函数能执行大量不同的文件操作 OpenFileMapping 打开一个现成的文件映射对象 QueryDosDevice 在Windows NT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况 ReadFile 从文件中读出数据 ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调 RegCloseKey 关闭系统注册表中的一个项(或键) RegConnectRegistry 访问远程系统的部分注册表 RegCreateKey 在指定的项下创建或打开一个项 RegCreateKeyEx 在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数 RegDeleteKey 删除现有项下方一个指定的子项 RegDeleteValue 删除指定项下方的一个值 RegEnumKey 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx RegEnumKeyEx 枚举指定项下方的子项 RegEnumValue 枚举指定项的值 RegFlushKey 将对项和它的子项作出的改动实际写入磁盘 RegGetKeySecurity 获取与一个注册表项有关的安全信息 RegLoadKey 从以前用RegSaveKey函数创建的一个文件里装载注册表信息 RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制 RegOpenKey 打开一个现有的注册表项 RegOpenKeyEx 打开一个现有的项。在win32下推荐使用这个函数 RegQueryInfoKey 获取与一个项有关的信息 RegQueryValue 取得指定项或子项的默认(未命名)值 RegQueryValueEx 获取一个项的设置值 RegReplaceKey 用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息 RegRestoreKey 从一个磁盘文件恢复注册表信息 RegSaveKey 将一个项以及它的所有子项都保存到一个磁盘文件 RegSetKeySecurity 设置指定项的安全特性 RegSetValue 设置指定项或子项的默认值 RegSetValueEx 设置指定项的值 RegUnLoadKey 卸载指定的项以及它的所有子项 RemoveDirectory 删除指定目录 SearchPath 查找指定文件 SetCurrentDirectory 设置当前目录 SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾 SetFileAttributes 设置文件属性 SetFilePointer 在一个文件中设置当前的读写位置 SetFileTime 设置文件的创建、访问及上次修改时间 SetHandleCount 这个函数不必在win32下使用;即使使用,也不会有任何效果 SetVolumeLabel 设置一个磁盘的卷标(Label) SystemTimeToFileTime 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构 UnlockFile 解除对一个文件的锁定 UnlockFileEx 解除对一个文件的锁定 UnmapViewOfFile 在当前应用程序的内存地址空间解除对一个文件映射对象的映射 VerFindFile 用这个函数决定一个文件应安装到哪里 VerInstallFile 用这个函数安装一个文件 VerLanguageName 这个函数能根据16位语言代码获取一种语言的名称 VerQueryValue 这个函数用于从版本资源中获取信息 WriteFile 将数据写入一个文件 WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调 WritePrivateProfileSection 为一个初始化文件(.ini)中指定的小节设置所有项名和值 WritePrivateProfileString 在初始化文件指定小节内设置一个字串 WriteProfileSection 为Win.ini初始化文件中一个指定的小节设置所有项名和值 WriteProfileString 在Win.ini初始化文件指定小节内设置一个字串 4. API之打印函数 AbortDoc 取消一份文档的打印 AbortPrinter 删除与一台打印机关联在一起的缓冲文件 AddForm 为打印机的表单列表添加一个新表单 AddJob 用于获取一个有效的路径名,以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号 AddMonitor 为系统添加一个打印机监视器 AddPort 启动“添加端口”对话框,允许用户在系统可用端口列表中加入一个新端口 AddPrinter 在系统中添加一台新打印机 AddPrinterConnection 连接指定的打印机 AddPrinterDriver 为指定的系统添加一个打印驱动程序 AddPrintProcessor 为指定的系统添加一个打印处理器 AddPrintProvidor 为系统添加一个打印供应商 AdvancedDocumentProperties 启动打印机文档设置对话框 ClosePrinter 关闭一个打开的打印机对象 ConfigurePort 针对指定的端口,启动一个端口配置对话框 ConnectToPrinterDlg 启动连接打印机对话框,用它同访问网络的打印机连接 DeleteForm 从打印机可用表单列表中删除一个表单 DeleteMonitor 删除指定的打印监视器 DeletePort 启动“删除端口”对话框,允许用户从当前系统删除一个端口 DeletePrinter 将指定的打印机标志为从系统中删除 DeletePrinterConnection 删除与指定打印机的连接 DeletePrinterDriver 从系统删除一个打印机驱动程序 DeletePrintProcessor 从指定系统删除一个打印处理器 DeletePrintProvidor 从系统中删除一个打印供应商 DeviceCapabilities 利用这个函数可获得与一个设备的能力有关的信息 DocumentProperties 打印机配置控制函数 EndDocAPI 结束一个成功的打印作业 EndDocPrinter 在后台打印程序的级别指定一个文档的结束 EndPage 用这个函数完成一个页面的打印,并准备设备场景,以便打印下一个页 EndPagePrinter 指定一个页在打印作业中的结尾 EnumForms 枚举一台打印机可用的表单 EnumJobs 枚举打印队列中的作业 EnumMonitors 枚举可用的打印监视器 EnumPorts 枚举一个系统可用的端口 EnumPrinterDrivers 枚举指定系统中已安装的打印机驱动程序 EnumPrinters 枚举系统中安装的打印机 EnumPrintProcessorDatatypes 枚举由一个打印处理器支持的数据类型 EnumPrintProcessors 枚举系统中可用的打印处理器 Escape 设备控制函数 FindClosePrinterChangeNotification 关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象 FindFirstPrinterChangeNotification 创建一个新的改变通告对象,以便我们注意打印机状态的各种变化 FindNextPrinterChangeNotification 用这个函数判断触发一次打印机改变通告信号的原因 FreePrinterNotifyInfo 释放由FindNextPrinterChangeNotification函数分配的一个缓冲区 GetForm 取得与指定表单有关的信息 GetJob 获取与指定作业有关的信息 GetPrinter 取得与指定打印机有关的信息 GetPrinterData 为打印机设置注册表配置信息 GetPrinterDriver 针对指定的打印机,获取与打印机驱动程序有关的信息 GetPrinterDriverDirectory 判断指定系统中包含了打印机驱动程序的目录是什么 GetPrintProcessorDirectory 判断指定系统中包含了打印机处理器驱动程序及文件的目录 OpenPrinter 打开指定的打印机,并获取打印机的句柄 PrinterMessageBox 在拥有指定打印作业的系统上显示一个打印机出错消息框 PrinterProperties 启动打印机属性对话框,以便对打印机进行配置 ReadPrinter 从打印机读入数据 ResetDC 重设一个设备场景 ResetPrinter 改变指定打印机的默认数据类型及文档设置 ScheduleJob 提交一个要打印的作业 SetAbortProc 为Windows指定取消函数的地址 SetForm 为指定的表单设置信息 SetJob 对一个打印作业的状态进行控制 SetPrinter 对一台打印机的状态进行控制 SetPrinterData 设置打印机的注册表配置信息 StartDoc 开始一个打印作业 StartDocPrinter 在后台打印的级别启动一个新文档 StartPage 打印一个新页前要先调用这个函数 StartPagePrinter 在打印作业中指定一个新页的开始 WritePrinter 将发送目录中的数据写入打印机 5. API之文本和字体函数 AddFontResource 在Windows系统中添加一种字体资源 CreateFont 用指定的属性创建一种逻辑字体 CreateFontIndirect 用指定的属性创建一种逻辑字体 CreateScalableFontResource 为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统 DrawText 将文本描绘到指定的矩形中 DrawTextEx 与DrawText相似,只是加入了更多的功能 EnumFontFamilies 列举指定设备可用的字体 EnumFontFamiliesEx 列举指定设备可用的字体 EnumFonts 列举指定设备可用的字体 ExtTextOut 经过扩展的文本描绘函数。也请参考SetTextAlign函数 GetAspectRatioFilterEx 用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时,本函数可判断纵横比大小 GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小 GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸 GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串 GetCharWidth 调查字体中一个或多个字符的宽度 GetFontData 接收一种可缩放字体文件的数据 GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息 GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息 GetKerningPairs 取得指定字体的字距信息 GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息 GetRasterizerCaps 了解系统是否有能力支持可缩放的字体 GetTabbedTextExtent 判断一个字串占据的范围,同时考虑制表站扩充的因素 GetTextAlign 接收一个设备场景当前的文本对齐标志 GetTextCharacterExtra 判断额外字符间距的当前值 GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符 GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息 GetTextColor 判断当前字体颜色。通常也称为“前景色” GetTextExtentExPoint 判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息 GetTextExtentPoint 判断一个字串的大小(范围) GetTextFace 获取一种字体的字样名 GetTextMetrics 获取与选入一种设备场景的物理字体有关的信息 GrayString 描绘一个以灰色显示的字串。通常由Windows用于标识禁止状态 PolyTextOut 描绘一系列字串 RemoveFontResource 从Windows系统中删除一种字体资源 SetMapperFlags Windows对字体进行映射时,可用该函数选择与目标设备的纵横比相符的光栅字体 SetTextAlign 设置文本对齐方式,并指定在文本输出过程中使用设备场景的当前位置 SetTextCharacterExtra 描绘文本的时候,指定要在字符间插入的额外间距 SetTextColor 设置当前文本颜色。这种颜色也称为“前景色” SetTextJustification 通过指定一个文本行应占据的额外空间,可用这个函数对文本进行两端对齐处理 TabbedTextOut 支持制表站的一个文本描绘函数 TextOut 文本绘图函数 6. API之菜单函数 AppendMenu 在指定的菜单里添加一个菜单项 CheckMenuItem 复选或撤消复选指定的菜单条目 CheckMenuRadioItem 指定一个菜单条目被复选成“单选”项目 CreateMenu 创建新菜单 CreatePopupMenu 创建一个空的弹出式菜单 DeleteMenu 删除指定的菜单条目 DestroyMenu 删除指定的菜单 DrawMenuBar 为指定的窗口重画菜单 EnableMenuItem 允许或禁止指定的菜单条目 GetMenu 取得窗口中一个菜单的句柄 GetMenuCheckMarkDimensions 返回一个菜单复选符的大小 GetMenuContextHelpId 取得一个菜单的帮助场景ID GetMenuDefaultItem 判断菜单中的哪个条目是默认条目 GetMenuItemCount 返回菜单中条目(菜单项)的数量 GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID GetMenuItemInfo 取得(接收)与一个菜单条目有关的特定信息 GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息 GetMenuState 取得与指定菜单条目状态有关的信息 GetMenuString 取得指定菜单条目的字串 GetSubMenu 取得一个弹出式菜单的句柄,它位于菜单中指定的位置 GetSystemMenu 取得指定窗口的系统菜单的句柄 HiliteMenuItem 控制顶级菜单条目的加亮显示状态 InsertMenu 在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动 InsertMenuItem 插入一个新菜单条目 IsMenu 判断指定的句柄是否为一个菜单的句柄 LoadMenu 从指定的模块或应用程序实例中载入一个菜单 LoadMenuIndirect 载入一个菜单 MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点 ModifyMenu 改变菜单条目 RemoveMenu 删除指定的菜单条目 SetMenu 设置窗口菜单 SetMenuContextHelpId 设置一个菜单的帮助场景ID SetMenuDefaultItem 将一个菜单条目设为默认条目 SetMenuItemBitmaps 设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√) SetMenuItemInfo 为一个菜单条目设置指定的信息 TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单 TrackPopupMenuEx 与TrackPopupMenu相似,只是它提供了额外的功能

WINDOWS消息处理过程

一、 引言二、Windows消息机制的概念1、DOS与Windows驱动机制的区别2、消息3、消息的来源4、Windows的消息系统的组成5、消息的响应三、Windows消息机制要点1. 窗口过程2 消息类型3消息队列(Message Queues)4 队列消息和非队列消息5 Windows消息函数6消息死锁( Message Deadlocks7 BroadcastSystemMessage四、MFC消息机制1.MFC框架下,接收处理来自Windows消息的过程2.MFC内部消息处理方式一、 引言在 C++程序架构 一文中,我们看到,程序是由一些层次和模块组成的,那么,这些模块之间, 以及你的程序和windows 之间,是如何传递信息呢?在windows 的平台上,传递信息是由 windows message 消息机制来负责的,这是Windows 的核心部分。消息包括数据和指令。二、Windows消息机制的概念1、DOS与Windows驱动机制的区别1)DOS是过程驱动的。传统的MS-DOS程序主要采用顺序的。关联的、过程驱动的程序设计方法。一个过程是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型如图1.1所示。2)Windows是事件(消息)驱动事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图1.2所示:2、消息Windows系统是一个事件驱动的OS,每一个事件的发生都会产生一个消息,我们通过消息来知道发生了什么事件,了解事件,进而解决事件。什么是消息呢?很难下一个定义,下面从不同的几个方面讲解一下: 1) 消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2)谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3)未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4)窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。3、消息的来源事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。事件驱动是靠消息循环机制来实现的。也可以理解为消息是一种报告有关事件发生的通知。Windows应用程序的消息来源有一下四种:1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。2)控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,象DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。 4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。4、Windows的消息系统的组成Windows的消息系统由以下3部分组成:消息队列:Windows能够为所有的应用程序维护一个消息队列,应用程序必须从消息队列中获去消息,然后分派给某个窗体。消息循环:通过这个循环机制,应用程序从消息队列中检索消息,再把它分派给适当的窗口,然后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。窗口过程:每个窗口都有一个窗口过程,以接收Windows 传递给窗口的消息,窗口过程的任务就是获取消息并且响应它。窗口过程是一个回调函数,处理完一个消息后,通常要给Windows 一个返回值。5、消息的响应消息的产生来源于系统事情(包括计时器事件)和用户事情,Windows用消息来调入和关闭(还有其它处理,如绘制一个窗口等)应用程序,一个典型表现是在关机操作中,Windows发一个关机的消息给所有正在运行的应用程序,告知它们退出内存,此时,应用程序用回应消息的方法来响应OS,因此,消息是应用程序与WinOS交互的手段..消息产生到被窗口响应的步骤:(如下图)1》 系统发生了或用户发出某个事件。2》 Windows把这个事件翻译为消息,然后把他放到消息队列中3》 应用程序从消息队列中接受到这个消息,把他存放到TMsg记录中。4》 应用程序把消息传递给一个适当的窗体过程。窗体过程响应这个消息并进行处理。把消息传递给了这个窗体的窗体函数。三、Windows消息机制要点1. 窗口过程每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)2 消息类型1) 系统定义消息(System-Defined Messages)在SDK中事先定义好的消息,非用户定义的,其范围在[0×0000, 0×03ff]之间, 可以分为以下三类:窗口消息(Windows Message)与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,可以是 Dialog,控件等。如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL..命令消息(Command Message)与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型 控件通知(Notify Message)控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。2) 程序定义消息(Application-Defined Messages)用户自定义的消息, 对于其范围有如下规定: WM_USER: 0×0400-0×7FFF (ex. WM_USER+10) WM_APP(winver》4.0): 0×8000-0xBFFF (ex.WM_APP+4)RegisterWindowMessage: 0xC000-0xFFFF3消息队列(Message Queues)Windows中有两种类型的消息队列 1) 系统消息队列(System Message Queue)这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理2) 线程消息队列(Thread-specific Message Queue)每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。4 队列消息(Queued Messages)和非队列消息(Non-Queued Messages)1)队列消息(Queued Messages)消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理如鼠标,键盘消息。2) 非队列消息(NonQueued Messages)消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理5 Windows消息函数1)PostMessage(PostThreadMessage), SendMessagePostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。2)GetMessage, PeekMessagePeekMessage会立即返回 可以保留消息GetMessage在有消息时返回 会删除消息3) TranslateMessage, TranslateAcceleratorTranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。6消息死锁( Message Deadlocks假设有线程A和B, 现在有以下下步骤1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回2)线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了\线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。7 BroadcastSystemMessage我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等,BroadcastSystemMessage这个API可以对以上系统组件发送消息。那么这些消息是怎样传送的呢。我们以MFC为例来看一下消息传送过程。四、MFC消息机制在Windows应用程序的主函数中,首先要注册窗口类,然后创建并显示窗口。创建窗口后程序就进入消息循环,在消息循环中,程序不断地获得消息并将消息派送给对应的窗口函数进行处理。我们可以看到,在MFC的框架结构下,可以进行消息处理的类的头文件里面都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声明。可以进行消息处理的类的实现文件里一般都含有如下的结构。BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //{{AFX_MSG_MAP(CInheritClass)//}}AFX_MSG_MAPEND_MESSAGE_MAP()这里主要进行消息映射的实现和消息处理函数的实现。 所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。 同时MFC定义了下面的两个主要结构: AFX_MSGMAP_ENTRYstruct AFX_MSGMAP_ENTRY{//“““//};和AFX_MSGMAPstruct AFX_MSGMAP{//“““`//}; 其中AFX_MSGMAP_ENTRY结构包含了一个消息的所有相关信息, 而AFX_MSGMAP主要作用是两个,一:用来得到基类的消息映射入口地址。二:得到本身的消息映射入口地址。 实际上,MFC把所有的消息一条条填入到AFX_MSGMAP_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的消息的参数。同时通过AFX_MSGMAP能得到该数组的首地址,同时也得到基类的消息映射入口地址,这是为例当本身对该消息不响应的时候,就调用其基类的消息响应。现在我们来分析MFC是如何让窗口过程来处理消息的,实际上所有MFC的窗口类都通过钩子函数_AfxCbtFilterHook截获消息,并且在钩子函数_AfxCbtFilterHook中把窗口过程设定为AfxWndProc。原来的窗口过程保存在成员变量m_pfnSuper中1.MFC框架下,接收处理来自Windows消息的过程:2.MFC内部消息处理方式MFC接收一个寄送的消息:MFC处理一个寄送和发送消息的惟一明显不同是寄送的消息要做应用程序的消息队列中花费一些时间。在消息泵(message pump)弹出它之前,它要一直在队列中。下面是怎样接受寄送消息的过程。MFC应用程序中的消息泵在CWinApp的成员函数Run()中。应用程序开始运行时,Run()就被调用,Run()把时间分割成两部分。一部分用来执行后台处理,如取消临时CWnd对象;另一部分用来检查消息队列。当一个新的消息进来时,Run()抽取它—即用GetMessage( )从队列中取出该消息,运行PreTranslateMessage( )和::TranslateMessage( )两个消息翻译函数,然后用DispatchMessage( )函数调用该消息预期的目标窗口进程。如下图。我们用一个实例函数A发送消息到函数B的过程来看一下MFC内部消息处理过程。1. 首先函数A应获取消息的CWnd类对象的指针,然后,调用CWnd的成员函数SendMessage()。LRESULT Res=pWnd-》SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam); pWnd指针指向目标CWnd类对象。变量Msg是消息,wParam和lParam变量包含消息的参数,如鼠标单单击哪里或选择了什么菜单项。目标窗口返回的消息结果放在变量Res中。发送消息到一个没有CWnd的函数对象的窗口,可以用下列目标窗口的句柄直接调用Windows API:LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); 这里的hWnd是目标窗口的句柄。如果是异步传输也可使用PostMessage(),消息同上相同,但返回值Res不一样,Res不是一个由目标窗体返回的值,而是一个布尔值,用来表示消息是否成功的放到消息队列中。2. 正常情况下,一旦消息被发送后,应用程序后台会自动的将它发送,但是在特殊情况下,需要你自己去删除一个消息,例如想在应用程序接收到某种消息之前停止应用程序。有两种方法可以从应用程序消息队列中删除一个消息,但这两种方法都没有涉及MFC。第一种方法:在不干扰任何事情之下窥视消息队列,看看一个消息是否在那里。 BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ; 第二种方法:实际上是等待,一直等到一个新的消息到达队列为止,然后删除并返回该消息。 BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); 在这两种方法中,变量hWnd指定要截获消息的窗口,如果该变量设为NULL,所有窗口消息将被截获。wMsgFilterMin和wMsgFilterMax变量与SendMessage( )中的变量Msg相对应,指定查看消息的范围。如果用“0,0〃,则所有的消息都将被截获。如果用WM_KEYFIRST,WM_KEYLAST或WM_MOUSEFIRST,WM_MOUSELAST,则所有键盘或鼠标的消息将被截获。wRemoveMsg变量指定PeekMessage( )是否应该真正地从队列中删除该消息。(GetMessage( )总是删除消息)。该变量可以取两个值: PM_REMOVE,PeekMessage( )将删除消息。 PM_NOREMOVE,PeekMessage( )将把消息留在队列里,并返回它的一个拷贝。 当然,如果把消息留在消息队列中,然后再次调用PeekMessage( )查看相同类型的消息,则将返回完全相同的消息。 lpMsg变量是一个指向MSG结构的指针,MSG包含检索到的消息。 typedef struct tagMSG { HWND hwnd; // window handle message is intended for UINT message; WPARAM wParam; LPARAM lParam; DWORD time; // the time the message was put in the queue POINT pt; // the location of the mouse cursor when the // message was put in the queue } MSG;3. 消息会到消息队列中。CwinApp的成员函数Run,在应用程序运行时,Run就把时间分割成两部分,一部分执行后台的处理,另一部分来检查消息的队列,当发现新消息时,Run就调用GetMessage()从队列消息中取出该消息。3.运行两个消息翻译函数PreTranslateMessage()和::TranslateMessage(),进行翻译。主要找到函数对象的位置、消息的动作标识和跟消息相关的执行操作。4.用DispatchMessage()函数调用该消息预期的函数B进程,进行执行。

ON_REGISTERED_MESSAGE

ON_REGISTERED_MESSAGE是注册消息映射宏,原型如下;ON_REGISTERED_MESSAGE(nMessageVariable, memberFxn )nMessageVariable注册的Windows消息ID变量memberFxn消息处理函数名检查你的m_OverLoadMessage是否是Window注册消息变量。应该这样定义此变量static UINT NEAR WM_OVER_LOAD = RegisterWindowMessage(_T(“OVER_LOAD“));宏和函数声明为ON_REGISTERED_MESSAGE(WM_OVER_LOAD, OnOverLoad) afx_msg LRESULT OnOverLoad(WPARAM wParam, LPARAM lParam);

关于C#的Hook技术问题

只有键盘和鼠标可以在托管代码中实现全局钩子,否则要通过C++写DLL,原因貌似.net的垃圾回收机制? 思路可以这样 在DLL里面 1)用SetProp函数将C#写的一个窗口设置成特别的属性,比如: SetProp(GetDesktopWindow(), “FLAG_WND“, target); 2)挂上钩子,捕捉到相应的Hook code后,用RegisterWindowMessage函数注册信息,然后用SendNotifyMessage函数将该信息发送给特定属性的托管窗口


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 如何下载浏览器(怎样在电脑上下载浏览器并安装)

下一篇: 备皮操作步骤有哪些,备皮操作过程(一次性使用备皮包是做什么用的)



推荐阅读