!!!!!如 何 在 IE 控 件 中 利 用 钩 子 拦 截 页 面 COPY 或 者 页 面 文 本 的 选 中 ? 希望能得到完整的例子 谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hTarWnd 是要取得的IE窗口的句柄////////////////#include <mshtml.h>#include <comdef.h>BOOL GetHtmlText(HWND hTarWnd ,CString &strText){ LPDISPATCH lpDispatch; HRESULT hr; IShellWindows* pSWnd;// IClassFactory* pCF = NULL;// hr = CoGetClassObject(CLSID_ShellWindows, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (VOID**)&pCF); // if(FAILED(hr))// return FALSE;//// hr = pCF->CreateInstance(NULL, IID_IWebBrowser, (LPVOID*)&pSWnd);// pCF->Release(); // if(FAILED(hr))// return FALSE;// HWND hForeWnd = GetForegroundWindow(); if(FAILED(hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_SERVER, IID_IShellWindows, (LPVOID*)&pSWnd))) { TRACE(_T("Failed to create Instance :-( ")) ; return FALSE; } long lIEWndCnt; IWebBrowserApp* pWBrowserApp = NULL; if(FAILED(pSWnd->get_Count(&lIEWndCnt))) { pSWnd->Release(); return FALSE; } for(long l = 0; l < lIEWndCnt; l++) { VARIANT index; V_VT(&index) = VT_I4; V_I4(&index) = l; lpDispatch = NULL; if(FAILED(hr = pSWnd->Item(index, &lpDispatch))) { continue; } if(!lpDispatch) { continue; } if(FAILED(hr = lpDispatch->QueryInterface(IID_IWebBrowserApp, (LPVOID*)&pWBrowserApp))) { continue; } long hIEWnd; if(SUCCEEDED(hr = pWBrowserApp->get_HWND(&hIEWnd))) { if((HWND)hIEWnd == hTarWnd) { break; } } pWBrowserApp->Release(); pWBrowserApp = NULL; } pSWnd->Release(); if(pWBrowserApp) {//找到了IE窗口 if(FAILED(hr = pWBrowserApp->get_Document(&lpDispatch))) { return FALSE; } IHTMLDocument2* pHTMLDoc; if(FAILED(hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDoc))) { return FALSE; } BSTR bstrText ; //CString strText; hr = pHTMLDoc->get_title(&bstrText); if (SUCCEEDED(hr)) { _bstr_t bstr(bstrText, false); strText = (LPCTSTR)bstr; } IHTMLElement *pElement; hr = pHTMLDoc->get_body((IHTMLElement **)&pElement);// hr = pHTMLDoc->get_activeElement((IHTMLElement **)&pElement); if(SUCCEEDED(hr)) { hr = pElement->get_innerText(&bstrText);// hr = pElement->get_innerHTML(&pText);// hr = pElement->get_outerHTML(&pText); if(SUCCEEDED(hr)) { _bstr_t bstr(bstrText, false); strText += (LPCTSTR)bstr;// CFile fileText("D:\\IEText.txt", CFile::modeCreate | CFile::modeWrite);// fileText.WriteHuge(LPCTSTR(strText), strText.GetLength());// fileText.Close(); } pElement->Release(); } pHTMLDoc->Release(); pWBrowserApp->Release(); } return TRUE;} 得到IE窗口的句柄:HWND hWndIE = FindWindow("IEFrame",NULL); horizon_tj(地平线):我的目的是要拦截也面文本拷贝或者页面文本选中 能告诉我你的函数怎么用吗 file/save as也可以COPY你的文档的呵呵 那个可以加密控制 目的是只可以看不可以COPY文本 我做了一个钩子,但是不知道怎么实现用钩子钩住页面的文本选中或者文本复制事件(只钩住CTR+C是不够的) SetWindowsHookEx(??,LowLevelKeyboardProc,glhInstance,0);第一个参数到底该用什么呢 用过WH_GETMESSAGE 但是不知道怎么才能截获上述的消息 还有就是希望这个钩子只在当前的页面里面起作用 而在其他窗口中可以正常的复制或者选中 网页上的框框与windows上的不太一样,用windows的消息过程(如钩子)好象不能实现。具体怎么做,我也不知道。如果谁有办法,能否share。My E-Mail:[email protected] 我做的控件中有一个方法STDMETHODIMP CMYCtrl::XCmdTargetObj::Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG* pvarargIn, VARIANTARG* pvarargOut) { METHOD_PROLOGUE(CMYCtrl, CmdTargetObj) if (nCmdID == OLECMDID_STOP) { // ... STOP button is clicked, add YOUR own code here. // We just display a message box. ::MessageBox(NULL, "不许stop","CMYCtrl", MB_OK); } return S_OK; }这个方法只能取得IE的STOP事件 但是其他事件却不能取到 包括OLECMDID_CUT,OLECMDID_COPY,OLECMDID_PASTE等 急切盼望高手相助!!! WinExec()打开IE,可不可以得到句柄呀? BOOL fEatKeystroke = FALSE; PKBDLLHOOKSTRUCT p = NULL; if (nCode == HC_ACTION) { MSG* msg = (MSG*)lParam; if(nCode == WM_COPY) fEatKeystroke = 0; p = (PKBDLLHOOKSTRUCT) lParam; switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: fEatKeystroke = (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) || // 屏蔽Win // 屏蔽Alt+Tab ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) || // 屏蔽Alt+Esc ((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) || // 屏蔽Ctrl+Esc ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)) || // 屏蔽Ctrl+C ((p->vkCode == '0X43') && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)) ; break; default: break; } } return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));虽然截获了CTR+C事件 但是文本还是被复制了 没有起到效果啊 请高手相助!! LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){ BOOL fEatKeystroke = FALSE; PKBDLLHOOKSTRUCT p = NULL; if (nCode == HC_ACTION) { p = (PKBDLLHOOKSTRUCT) lParam; switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: // 屏蔽Ctrl+C fEatKeystroke = ((p->vkCode == '0X43') && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)); break; default: break; } } return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));}目的截获CTRL+C 虽然事件截获了 但是还是可以COPY的 没有达到效果 望高手相助!!!!!!!!!!!!!!! 再问关于Win7 SDK程序移植到XP系统的解决方案 ocx 打包成CAB文件时版本填写 在对话框中获取CWnd*错误 为什么我的对话框程序中起始时没有按钮显示呢? 如何在基于 MFC 的程序中使用vector ? 急急急!还有二天了,作不完,过年成问题了! 请教数据库的多次连接问题 怎么定位 Access Violation错误???? 'CEndView' : undeclared identifier 一个菜鸟的菜单问题 请问有关all center(呼叫中心)的开发,有谁接触过吗?我感激不尽!!100分送上 如何实现图像的任意角度旋转,哪位高手有vc实现的源代码?发过来,100相送!
////////////////
#include <mshtml.h>#include <comdef.h>BOOL GetHtmlText(HWND hTarWnd ,CString &strText)
{
LPDISPATCH lpDispatch;
HRESULT hr;
IShellWindows* pSWnd;// IClassFactory* pCF = NULL;
// hr = CoGetClassObject(CLSID_ShellWindows, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (VOID**)&pCF);
// if(FAILED(hr))
// return FALSE;
//
// hr = pCF->CreateInstance(NULL, IID_IWebBrowser, (LPVOID*)&pSWnd);
// pCF->Release();
// if(FAILED(hr))
// return FALSE;// HWND hForeWnd = GetForegroundWindow();
if(FAILED(hr = CoCreateInstance(CLSID_ShellWindows,
NULL,
CLSCTX_SERVER,
IID_IShellWindows,
(LPVOID*)&pSWnd)))
{
TRACE(_T("Failed to create Instance :-( ")) ;
return FALSE;
} long lIEWndCnt;
IWebBrowserApp* pWBrowserApp = NULL;
if(FAILED(pSWnd->get_Count(&lIEWndCnt)))
{
pSWnd->Release();
return FALSE;
} for(long l = 0; l < lIEWndCnt; l++)
{
VARIANT index;
V_VT(&index) = VT_I4;
V_I4(&index) = l;
lpDispatch = NULL;
if(FAILED(hr = pSWnd->Item(index, &lpDispatch)))
{
continue;
}
if(!lpDispatch)
{
continue;
} if(FAILED(hr = lpDispatch->QueryInterface(IID_IWebBrowserApp, (LPVOID*)&pWBrowserApp)))
{
continue;
} long hIEWnd;
if(SUCCEEDED(hr = pWBrowserApp->get_HWND(&hIEWnd)))
{
if((HWND)hIEWnd == hTarWnd)
{
break;
}
}
pWBrowserApp->Release();
pWBrowserApp = NULL;
}
pSWnd->Release(); if(pWBrowserApp)
{//找到了IE窗口
if(FAILED(hr = pWBrowserApp->get_Document(&lpDispatch)))
{
return FALSE;
} IHTMLDocument2* pHTMLDoc;
if(FAILED(hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDoc)))
{
return FALSE;
}
BSTR bstrText ;
//CString strText; hr = pHTMLDoc->get_title(&bstrText);
if (SUCCEEDED(hr))
{
_bstr_t bstr(bstrText, false);
strText = (LPCTSTR)bstr;
} IHTMLElement *pElement;
hr = pHTMLDoc->get_body((IHTMLElement **)&pElement);
// hr = pHTMLDoc->get_activeElement((IHTMLElement **)&pElement);
if(SUCCEEDED(hr))
{
hr = pElement->get_innerText(&bstrText);
// hr = pElement->get_innerHTML(&pText);
// hr = pElement->get_outerHTML(&pText);
if(SUCCEEDED(hr))
{
_bstr_t bstr(bstrText, false);
strText += (LPCTSTR)bstr;
// CFile fileText("D:\\IEText.txt", CFile::modeCreate | CFile::modeWrite);
// fileText.WriteHuge(LPCTSTR(strText), strText.GetLength());
// fileText.Close();
}
pElement->Release();
}
pHTMLDoc->Release();
pWBrowserApp->Release();
} return TRUE;
}
HWND hWndIE = FindWindow("IEFrame",NULL);
也可以COPY你的文档的
呵呵
如果谁有办法,能否share。
My E-Mail:[email protected]
STDMETHODIMP CMYCtrl::XCmdTargetObj::Exec(
const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
VARIANTARG* pvarargIn, VARIANTARG* pvarargOut) {
METHOD_PROLOGUE(CMYCtrl, CmdTargetObj) if (nCmdID == OLECMDID_STOP)
{
// ... STOP button is clicked, add YOUR own code here.
// We just display a message box.
::MessageBox(NULL, "不许stop","CMYCtrl", MB_OK);
} return S_OK;
}这个方法只能取得IE的STOP事件 但是其他事件却不能取到 包括OLECMDID_CUT,OLECMDID_COPY,OLECMDID_PASTE等 急切盼望高手相助!!!
PKBDLLHOOKSTRUCT p = NULL; if (nCode == HC_ACTION)
{
MSG* msg = (MSG*)lParam;
if(nCode == WM_COPY)
fEatKeystroke = 0; p = (PKBDLLHOOKSTRUCT) lParam;
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
fEatKeystroke = (p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN) || // 屏蔽Win
// 屏蔽Alt+Tab
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Alt+Esc
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 屏蔽Ctrl+Esc
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0))
||
// 屏蔽Ctrl+C
((p->vkCode == '0X43') && ((GetKeyState(VK_CONTROL) & 0x8000) != 0))
;
break;
default:
break;
}
} return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));虽然截获了CTR+C事件 但是文本还是被复制了 没有起到效果啊 请高手相助!!
{
BOOL fEatKeystroke = FALSE;
PKBDLLHOOKSTRUCT p = NULL; if (nCode == HC_ACTION)
{
p = (PKBDLLHOOKSTRUCT) lParam;
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
// 屏蔽Ctrl+C
fEatKeystroke = ((p->vkCode == '0X43') && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
break;
default:
break;
}
} return (fEatKeystroke ? TRUE : CallNextHookEx(glhHook,nCode,wParam,lParam));
}
目的截获CTRL+C 虽然事件截获了 但是还是可以COPY的 没有达到效果 望高手相助!!!!!!!!!!!!!!!