对别的程序作操作的话一般当然是用钩子,但事实上从实现原理来说,钩子就是写一个回调函数,通过系统调用来截取一些消息.因此用多线程的话,除了会在程序关闭时使线程关闭外,别的基本是一样的.通常的取词是通过截取鼠标消息,然后在悬停或其他时候再拷贝一份设备上下文DC实现的.假如我们建立一个线程,在其中显示一个非模态对话框然后通过对鼠标所在区域句柄的获得,同样可以对所在窗口进行操作,而且我感觉这样子还会更灵活,因为没有了系统的限制.
以下这段代码是开始截取的代码,类似于SetWindowsHook的功能
if (m_hThread!=INVALID_HANDLE_VALUE)
{
::TerminateThread(m_hThread,0);
::CloseHandle (m_hThread);
}
if (m_pDlg)
{
m_pDlg->CloseWindow ();
delete m_pDlg;
}
m_pDlg=new CDlgshow ();
m_pDlg->Create(IDD_DIALOG1,this);
// SetTransparent(pDlg->m_hWnd,50);
//pDlg->UnTransparent ();
m_hThread=::CreateThread(NULL,1024,thread_proc,(LPVOID)m_pDlg,NULL,NULL);
然后在线程处理函数中处理鼠标消息就行了
CDlgshow *pDlg=(CDlgshow*)lpParam;
while (1)
{
GetCursorPos (&pt);
hDlg=WindowFromPoint (pt);
if (hDlg&&hDlg!=pDlg->m_hWnd&&!IsInRect(pt,pDlg))
{
::SendMessage (hDlg,WM_GETTEXT,(WPARAM)127,(LPARAM)szTemp);
pDlg->SetTitleValue(szTemp);
::GetClassName (hDlg,szTemp,127);
pDlg->SetNameValue(szTemp);
pDlg->ShowWindow(SW_SHOW);
if (pDlg->IsFixed())
pDlg->SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
else
pDlg->SetWindowPos(&CWnd::wndTopMost,pt.x,pt.y,0,0,SWP_NOSIZE);
}
Sleep(1000);
}
这里是在其内显示所在窗口的类名和内容,好像以前有什么"密码查看器"之类也就是这点代码吧