现在的位置: 首页 > 综合 > 正文

用多线程实现金山词霸取词窗口

2013年02月11日 ⁄ 综合 ⁄ 共 1181字 ⁄ 字号 评论关闭

对别的程序作操作的话一般当然是用钩子,但事实上从实现原理来说,钩子就是写一个回调函数,通过系统调用来截取一些消息.因此用多线程的话,除了会在程序关闭时使线程关闭外,别的基本是一样的.通常的取词是通过截取鼠标消息,然后在悬停或其他时候再拷贝一份设备上下文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);
}

这里是在其内显示所在窗口的类名和内容,好像以前有什么"密码查看器"之类也就是这点代码吧

 

抱歉!评论已关闭.