模拟发送鼠标消息示例代码
2015-08-19 13:13
429 查看
CDialogEx* g_pDlg = nullptr;
HHOOK hhookMs = NULL;
LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam);
BOOL UninstallHook();
BOOL InstallHook();
BOOL InstallHook( )
{
if (hhookMs )
UninstallHook();
hhookMs = SetWindowsHookEx(WH_MOUSE_LL,
(HOOKPROC)LowLevelMouseProc, AfxGetApp()->m_hInstance, NULL);
return(hhookMs != NULL);
}
BOOL UninstallHook()
{
BOOL fOk = FALSE;
if (hhookMs ) {
fOk = UnhookWindowsHookEx(hhookMs );
hhookMs = NULL;
}
return(fOk);
}
LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam;
char strMsg[100] = {0};
switch (nCode)
{
case HC_ACTION:
{
//鼠标左击
if(wParam == WM_LBUTTONUP)
{
sprintf(strMsg, "WM_LBUTTONUP: x= %d, y= %d\n", pkbhs->pt.x, pkbhs->pt.y);
OutputDebugStringA(strMsg);
if (g_pDlg!=nullptr)
{
CRect rect;
g_pDlg->GetWindowRect(&rect);
POINT pt;
pt.x = pkbhs->pt.x - rect.left ;
pt.x = kagula::Clamp(0,rect.Width(),pt.x);
pt.y = pkbhs->pt.y - rect.top;
pt.y = kagula::Clamp(0,rect.Height(),pt.y);
g_pDlg->SendMessage(WM_LBUTTONUP,0,MAKELONG(pt.x, pt.y));
}
}
else if (wParam == WM_MOUSEMOVE)
{
if (g_pDlg!=nullptr)
{
CRect rect;
g_pDlg->GetWindowRect(&rect);
POINT pt;
pt.x = pkbhs->pt.x - rect.left ;
pt.x = kagula::Clamp(0,rect.Width(),pt.x);
pt.y = pkbhs->pt.y - rect.top;
pt.y = kagula::Clamp(0,rect.Height(),pt.y);
g_pDlg->SendMessage(WM_MOUSEMOVE,pkbhs->flags,MAKELONG(pt.x, pt.y));
}
}
}
default:
break;
}
return CallNextHookEx (NULL, nCode, wParam, lParam);
}
HHOOK hhookMs = NULL;
LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam);
BOOL UninstallHook();
BOOL InstallHook();
BOOL InstallHook( )
{
if (hhookMs )
UninstallHook();
hhookMs = SetWindowsHookEx(WH_MOUSE_LL,
(HOOKPROC)LowLevelMouseProc, AfxGetApp()->m_hInstance, NULL);
return(hhookMs != NULL);
}
BOOL UninstallHook()
{
BOOL fOk = FALSE;
if (hhookMs ) {
fOk = UnhookWindowsHookEx(hhookMs );
hhookMs = NULL;
}
return(fOk);
}
LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam;
char strMsg[100] = {0};
switch (nCode)
{
case HC_ACTION:
{
//鼠标左击
if(wParam == WM_LBUTTONUP)
{
sprintf(strMsg, "WM_LBUTTONUP: x= %d, y= %d\n", pkbhs->pt.x, pkbhs->pt.y);
OutputDebugStringA(strMsg);
if (g_pDlg!=nullptr)
{
CRect rect;
g_pDlg->GetWindowRect(&rect);
POINT pt;
pt.x = pkbhs->pt.x - rect.left ;
pt.x = kagula::Clamp(0,rect.Width(),pt.x);
pt.y = pkbhs->pt.y - rect.top;
pt.y = kagula::Clamp(0,rect.Height(),pt.y);
g_pDlg->SendMessage(WM_LBUTTONUP,0,MAKELONG(pt.x, pt.y));
}
}
else if (wParam == WM_MOUSEMOVE)
{
if (g_pDlg!=nullptr)
{
CRect rect;
g_pDlg->GetWindowRect(&rect);
POINT pt;
pt.x = pkbhs->pt.x - rect.left ;
pt.x = kagula::Clamp(0,rect.Width(),pt.x);
pt.y = pkbhs->pt.y - rect.top;
pt.y = kagula::Clamp(0,rect.Height(),pt.y);
g_pDlg->SendMessage(WM_MOUSEMOVE,pkbhs->flags,MAKELONG(pt.x, pt.y));
}
}
}
default:
break;
}
return CallNextHookEx (NULL, nCode, wParam, lParam);
}
相关文章推荐
- 数独游戏java版(二)--界面实现
- java自带线程池和队列详细讲解
- Java去除所有非中文字符串
- Java实现字典树TrieTree
- C#调用默认浏览器打开网页的几种方法
- 挑战程序设计竞赛里面的部分题目<用java写的>
- UVA 317 Hexagon
- 编写高质量代码改善C#程序的157个建议——建议71:区分异步和多线程应用场景
- 任意输入三个数判断其是否为三角形
- Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)
- 链表(java版本)
- 数独游戏java版(一)--核心算法
- C#实现简易的加密、解密字符串工具类实例
- php如何取得中文和en文混合的长度的讨论
- C++构造函数的调用
- 一些有用的php包与简单例子
- Java-单例设计模式
- java.lang.IllegalStateException: Observer AdapterDataSetObserver was not register setadapter空指针
- c#调用Excel绘制图表
- 保存FLTK的配置方法