要求:1、用全局勾子(dll)
2、当鼠标点击任意窗口上的控件时,得到该控件的句柄
3、将句柄传回主程序完成后另开贴给分。
2、当鼠标点击任意窗口上的控件时,得到该控件的句柄
3、将句柄传回主程序完成后另开贴给分。
解决方案 »
- 定时器中声明变量的问题
- CString的麻烦
- 有用过CxImage库的吗!
- 寻找 类似 PANEL 控件
- 小弟请问高手,如何将用VC实时采集的数据,用一个自动生成的文档保存下来
- 我怎么让richtext控件的滚动条自动滚动啊?
- 如何改变控件上的中文字体呀?比如edit,button等
- 在VC2005的Window窗体应用程序中怎样拖动窗体?
- 在线程中做循环WaitCommEvent,当串口有数据时读数。但是CPU占有率太高90%。有高手用过WaitCommEvent,怎样降低CPU占有率?WaitForSingleObject函数可以检测EV_RXCHAR事件么?
- 如何在VC中进行和Fortran的混编?急!!!
- 如何让CListCtrl中的图标居中显示
- 为什么程序运行中会弹出对话框提示类似“user breakpoint break at 0x.......”
2、HWND hWnd = WindowFromPoint(point);
3、把hWnd返回给主程序
{
if(nCode == HC_ACTION)
{
MOUSEHOOKSTURCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
g_hWnd = WindowFromPoint(pMHS->pt);//g_hWnd 全局变量
SendMessage(hWnd,WM_MYMESSAGE,0,(LPARAM)lParam;你的程序的窗口句柄
}
}
[email protected]和[email protected]都行
源码功能:
使用鼠标获取所有Windows 32位操作系统下鼠标下的密码。
通过鼠标移动可以改变另外一个程序界面的特征。
比如把一个灰色的按钮,设置成允许状态。把隐藏的按钮显示出来。
把灰色的菜单设置成允许,把隐藏的菜单显示出来。注意这是两个进程的操作。
有了源代码,你还可以扩充。
按你的方法,单击窗口也会得到窗口的句柄,而我要得到窗口上控件的句柄。To: wangjs720(听雨舟)
你的方法只要鼠标移动就会得到句柄
write by: C.H.K.K 2003.06.24
************************************************************/
//函数:处理鼠标钩子消息的函数
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
//鼠标消息钩子结构
MOUSEHOOKSTRUCT * stpMouseHook;//POINT stPoint;
HWND hHwnd;
char szTemp[512];
char szPrint[1024]; if(nCode<0)
{//当nCode小于0时必须返回CALLNEXTHOOKEX()
return CallNextHookEx(hhkMouse,nCode,wParam,lParam);
}
if(nCode==HC_ACTION)
{//处理鼠标消息钩子
//WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE
//WM_MOUSEWHEEL,WM_RBUTTONDOWN, or WM_RBUTTONUP. if(wParam==WM_RBUTTONUP )
{
stpMouseHook=(MOUSEHOOKSTRUCT *) lParam;
wsprintf(szTemp,"\nWindow's hwnd: %d \n Title:",stpMouseHook->hwnd);
strcpy(szPrint,szTemp);
//得到鼠标消息的窗口标题
GetWindowText(stpMouseHook->hwnd,szTemp,512);
strcat(szPrint,szTemp);
//得到鼠标消息的窗口类名
strcpy(szTemp,"\n Class Name:");
strcat(szPrint,szTemp);
GetClassName(stpMouseHook->hwnd,szTemp,512);
strcat(szPrint,szTemp);
//得到父窗口
hHwnd=GetParent(stpMouseHook->hwnd);
if( hHwnd )
{
wsprintf(szTemp,"\n Parent window hwnd:%d ",hHwnd);
strcat(szPrint,szTemp);
GetWindowText(hHwnd,szTemp,512);
strcat(szPrint,szTemp);
wsprintf(szTemp,"\n Parent window class name:");
strcat(szPrint,szTemp);
GetClassName(hHwnd,szTemp,512);
}
else
{
strcpy(szTemp,"\n No Parent window");
}
strcat(szPrint,szTemp); hHwnd=GetActiveWindow();
wsprintf(szTemp,"\n Active Window Hwnd:%d",hHwnd);
strcat(szPrint,szTemp);
//得到鼠标所在的桌面坐标
wsprintf(szTemp,"\n Position: x- %d",stpMouseHook->pt.x);
strcat(szPrint,szTemp);
wsprintf(szTemp,"\n y- %d",stpMouseHook->pt.y);
strcat(szPrint ,szTemp);
if(! FindWindow(NULL,"WH_MOUSE") )
MessageBox(NULL,szPrint,"WH_MOUSE",MB_SYSTEMMODAL);
//写入文件MOUSELOG.LOG
SaveLog("c:\\chkkMS.LOG",szPrint); }
}
return CallNextHookEx(hhkMouse,nCode,wParam,lParam);
//return 0;
}
//导出函数:设置鼠标钩子
EXPORT BOOL SetMouseHook()
{//挂上鼠标钩子
if(!(hhkMouse=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hIns,0)))
{ MessageBox(NULL,"can not set mouse hook","",0);
return FALSE;
}
MessageBox(NULL,"set WH_MOUSE hook","message:",0);
return TRUE;
}
//导出函数:卸载鼠标钩子
EXPORT BOOL UnSetMouseHook()
{//取消鼠标钩子
MessageBox(NULL,"unset WH_MOUSE hook","",0);
return UnhookWindowsHookEx(hhkMouse);
}
注意,在DLL中也应注册该消息。
我顺便问楼主一个问题,我现在已经找到控件的句柄了。如何去操作和控制它了???
这个我想了很久,而且这个控件不是window中的标准控件,是一个自定义控件,不是自己写的,他没有消息,而且是个com。
HWND SmallestWindowFromPoint( const POINT point )
{
RECT rect, rcTemp;
HWND hParent, hWnd, hTemp; hWnd = ::WindowFromPoint( point );
if( hWnd != NULL )
{
::GetWindowRect( hWnd, &rect );
hParent = ::GetParent( hWnd ); // Has window a parent?
if( hParent != NULL )
{
// Search down the Z-Order
hTemp = hWnd;
do{
hTemp = ::GetWindow( hTemp, GW_HWNDNEXT ); // Search window contains the point, hase the same parent, and is visible?
::GetWindowRect( hTemp, &rcTemp );
if(::PtInRect(&rcTemp, point) && ::GetParent(hTemp) == hParent && ::IsWindowVisible(hTemp))
{
// Is it smaller?
if(((rcTemp.right - rcTemp.left) * (rcTemp.bottom - rcTemp.top)) < ((rect.right - rect.left) * (rect.bottom - rect.top)))
{
// Found new smaller window!
hWnd = hTemp;
::GetWindowRect(hWnd, &rect);
}
}
}while( hTemp != NULL );
}
} return hWnd;
}
发一个源程序学习学习!
只差一点,在dll中,如何把HOOK hook;设置为全局数据段?
只差一点,在dll中,如何把HOOK hook;设置为全局数据段?
就是在编译起里面加入;section:"sharedata" rws
sharedata 是在员代码里面定义的。
codeproject里面有一个模仿spy++的例子,很好。具体位置没记住,自己看看。
{
if(nCode == HC_ACTION)
{
if(wParam == WM_LBUTTONDOWN)
{
MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
g_hWnd = WindowFromPoint(pMHS->pt);
char szName[128];
GetClassName(g_hWnd,szName,128);
if(strcmp(szName,"Edit")==0)
{
MessageBox(NULL,szName, "szName",MB_ICONSTOP);
SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
return 1;
}
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
{
if(nCode == HC_ACTION)
{
if(wParam == WM_LBUTTONDOWN)
{
MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
g_hWnd = WindowFromPoint(pMHS->pt);
char szName[128];
GetClassName(g_hWnd,szName,128);
if(strcmp(szName,"Edit")==0)
{
MessageBox(NULL,szName, "szName",MB_ICONSTOP);
SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
return 1;
}
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
{
if(nCode == HC_ACTION)
{
if(wParam == WM_LBUTTONDOWN)
{
MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
g_hWnd = WindowFromPoint(pMHS->pt);
char szName[128];
GetClassName(g_hWnd,szName,128);
if(strcmp(szName,"Edit")==0)
{
MessageBox(NULL,szName, "szName",MB_ICONSTOP);
SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
return 1;
}
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
{
if(nCode == HC_ACTION)
{
if(wParam == WM_LBUTTONDOWN)
{
MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
g_hWnd = WindowFromPoint(pMHS->pt);
char szName[128];
GetClassName(g_hWnd,szName,128);
if(strcmp(szName,"Edit")==0)
{
MessageBox(NULL,szName, "szName",MB_ICONSTOP);
SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd); }
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}dll中的勾子的回调函数源码.