本文共 2713 字,大约阅读时间需要 9 分钟。
和Edit控件不同的是,Richedit支持RTF格式,采用WM_GETWINDOWTEXT消息只能得到文本信息,因此如果需要获取完整的RTF文件,则需要处理EM_STREAMOUT消息,将控件中的内容写出。有些控件对EM_STREAMOUT进行了过滤,则需要进一步处理EM_STREAMIN来在读入时截获原始数据。
3、 截获EM_STREAMIN、EM_STREAMOUT消息,将对应的内容写出。
WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information if( pCW->message == WM_HOOKSPY ) { g_wndProc = (WNDPROC)::SetWindowLongPtrA( g_hWnd, GWLP_WNDPROC,(LONG_PTR)RichEdit_WndProc ); return ::CallNextHookEx(g_hHook, code, wParam, lParam); RichEdit_WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) if( Msg == EM_STREAMIN ) // 拦截本消息,将内容写入到文本 IStream * lpStream = NULL; HRESULT hr = CreateStreamOnHGlobal( NULL, FALSE, &lpStream ); if( SUCCEEDED( hr ) && lpStream != NULL ) // 将内容写入到Stream,并发送到Hook进程 SendMessage( g_hLocalREdit,WM_COPYDATA ,(WPARAM)hWnd,(LPARAM)&cds ); ::SetWindowLongPtrA( hWnd, GWLP_WNDPROC,(LONG_PTR)g_wndProc ); return ::CallWindowProcA( g_wndProc, hWnd, Msg, wParam, lParam ); int HookRemoteWindow( HWND hRemoteWnd, HWND hLocalWnd, BOOL bHook ) g_hLocalREdit = hLocalWnd; // Hook the thread, that "owns" our PWD control g_hHook = SetWindowsHookEx( WH_CALLWNDPROC,(HOOKPROC)HookProc, hDll, GetWindowThreadProcessId(g_hWnd,NULL) ); WM_HOOKSPY = ::RegisterWindowMessage( "WM_HOOKSPY_RK" ); SendMessage( g_hWnd, WM_HOOKSPY,0,0 ); SendMessage( hRemoteWnd,WM_HOOKSPY,1,1 ); ::UnhookWindowsHookEx( g_hHook ); 3、 在对话框中接受Hook Dll发送的数据并显示
MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) COPYDATASTRUCT* lpcds = (COPYDATASTRUCT*) dwCookie; LONG realSize = min( lpcds->cbData, cb ); memcpy( pbBuff,lpcds->lpData, realSize ); LPBYTE ptr = (LPBYTE)lpcds->lpData; lpcds->cbData -= realSize; BOOL CCrackDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) es.dwCookie = (DWORD)pCopyDataStruct; es.pfnCallback = MyStreamInCallback; m_richEdit1.StreamIn( pCopyDataStruct->dwData, es ); return CDialog::OnCopyData(pWnd, pCopyDataStruct);
from:http://hi.baidu.com/li_guotao/blog/item/2850bc456e3b8f22cefca34f.html