用多線程實現金山詞霸取詞窗口

對別的程序作操作的話一般當然是用鉤子,但事實上從實現原理來說,鉤子就是寫一個回調函數,通過系統調用來截取一些消息.因此用多線程的話,除了會在程序關閉時使線程關閉外,別的基本是一樣的.通常的取詞是通過截取鼠標消息,然後在懸停或其他時候再拷貝一份設備上下文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);
}

這裏是在其內顯示所在窗口的類名和內容,好像以前有什麼"密碼查看器"之類也就是這點代碼吧

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章