【c++】CHtmlView链接在本窗口中打开(类似于在另一个标签中打开)

代码实现:

void C*****View::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
{
 // TODO: Add your specialized code here and/or call the base class
 CWinApp*   pApp   =   AfxGetApp();

      //   Get   the   correct   document   template.
    POSITION   pos   =   pApp-> GetFirstDocTemplatePosition();
   
 CDocTemplate*   pDocTemplate   =   pApp-> GetNextDocTemplate(   pos   );

      //   Create   a   new   frame.
    CFrameWnd*   pFrame   =   pDocTemplate-> CreateNewFrame(GetDocument(), (CFrameWnd*)AfxGetMainWnd());

      //   Activate   the   frame.
    pDocTemplate-> InitialUpdateFrame(   pFrame,   NULL   );
     
 C*****View*   pView   =   (C*****View*)pFrame-> GetActiveView();

      //   Pass   pointer   of   WebBrowser   object.
    pView-> SetRegisterAsBrowser(   TRUE   );
     
 *ppDisp   =   pView-> GetApplication();
 //CHtmlView::OnNewWindow2(ppDisp, Cancel);
}

【c++】CHtmlView屏蔽js脚本

实现代码:

void C******View::OnNavigateComplete2(LPCTSTR strURL)
{
 // TODO: Add your specialized code here and/or call the base class
 
 CComPtr<IDispatch>   spDisp   =   GetHtmlDocument();
    if(spDisp!=NULL) 
    {
        CComPtr<IHTMLDocument2> doc;
        spDisp->QueryInterface(IID_IHTMLDocument2, reinterpret_cast<void**>(&doc));
        if(doc != NULL)
        {  
            IHTMLWindow2 * pIhtmlwindow2 = NULL;
            doc->get_parentWindow(&pIhtmlwindow2);
            if(pIhtmlwindow2 != NULL)
            {//”function fnOnError(msg,url,lineno){alert(‘script error:\\n\\nURL:’+url+’\\n\\nMSG:’+msg +’\\n\\nLine:’+lineno);return true;}window.onerror=fnOnError;”;
                //屏蔽javascript脚本错误的javascript脚本
                CString strJavaScriptCode = “function fnOnError(){return true;}window.onerror=fnOnError;”;
                BSTR bstrScript = strJavaScriptCode.AllocSysString();
                CString strLanguage(“JavaScript”);
                BSTR bstrLanguage = strLanguage.AllocSysString();
                long lTime = 1 * 1000;
                long lTimeID = 0;
                VARIANT varLanguage;
                varLanguage.vt = VT_BSTR;
                varLanguage.bstrVal = bstrLanguage;
                VARIANT pRet;
                //把window.onerror函数插入入当前页面中去
                pIhtmlwindow2->execScript(bstrScript, bstrLanguage, &pRet);
                ::SysFreeString(bstrScript);
                ::SysFreeString(bstrLanguage);
                pIhtmlwindow2->Release();
            }
        }
    }
 CHtmlView::OnNavigateComplete2(strURL);
}

以及:

void C*******View::OnBeforeNavigate2(LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel)
{
 // TODO: Add your specialized code here and/or call the base class
 
 SetSilent(true);

 CHtmlView::OnBeforeNavigate2(lpszURL, nFlags, lpszTargetFrameName, baPostedData, lpszHeaders, pbCancel);
}

【C++】CHtmlView屏蔽右键菜单以及选择功能实现

如下代码实现:

int nVirtKey;

 //屏蔽右键菜单
 if ((pMsg->message == WM_RBUTTONDOWN) || (pMsg->message == WM_RBUTTONDBLCLK))
          
  return TRUE;

 //禁止招标标显示I型指针
 HCURSOR curIbeam = LoadCursor( NULL, IDC_IBEAM );

 if ( GetCursor() == curIbeam )
 {
 HCURSOR curArrow = LoadCursor( NULL, IDC_ARROW );
 
 SetCursor( curArrow );

 }

 //禁止选择
 if ( pMsg->message == WM_MOUSEMOVE )
 {
 nVirtKey = GetKeyState( VK_LBUTTON );
 if ( nVirtKey & 0x8000 )
 {
  return TRUE;
 }
 }

【c++】全局钩子技术 – 监视打开的程序

注: dll文件

第一步: 定义全局钩子

HHOOK g_hHookShell;

第二步:

LRESULT CALLBACK ShellHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{

if (nCode == HSHELL_WINDOWCREATED)// Windows Created
{
//针对WH_SHELL的HSHELL_WINDOWCREATED,wParam传递的是打开创建的窗口名称,而lParam无效(0).
//PostMessage(g_hWndMain,WM_SHELLHOOK,wParam,lParam);
HWND m_hWnd = (HWND)wParam;
char strTitle[256];
::GetWindowText(m_hWnd,strTitle,1024);
MessageBox(m_hWnd,strTitle,”提示:”,MB_OK);

}
return CallNextHookEx(g_hHookShell,nCode,wParam,lParam);
}

BOOL SetHook()
{

g_hHookShell = SetWindowsHookEx(WH_SHELL, ShellHookProc,GetModuleHandle(“QJHook”),0);

return g_hHookShell ? TRUE : FALSE;

}

BOOL DestroyHook()
{
if (g_hHookShell == NULL)
{
return FALSE;
}

UnhookWindowsHookEx(g_hHookShell);
return TRUE;
}

直接导出SetHook,DestroyHook函数:

***.def文件

LIBRARY QJHook

EXPORTS
SetHook
DestroyHook

调用导出的函数:

#pragma comment(lib,”..\\Debug\\QJHook.lib”)

_declspec(dllimport) BOOL SetHook();
_declspec(dllimport) BOOL DestroyHook();

if(SetHook()){

AfxMessageBox(“加载dll成功!!!”);

}

if(DestroyHook()){

AfxMessageBox(“卸载dll成功!!!”);

}

【c++】线程注入技术

代码如下:

DWORD ProcID = (DWORD)GetDlgItemInt(IDC_EDIT_PID);

//获得进程句柄
HANDLE ProcHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcID);

//DLL路径
CString str=”E:\\项目\\插件制作\\软件\\hookdll\\test\\Debug\\test.dll”;

//以可执行,可写,可读方式创建虚拟空间
LPVOID VirAddress = VirtualAllocEx(ProcHandle,NULL,strlen(str)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

//写入空间
WriteProcessMemory(ProcHandle,VirAddress,(LPVOID)str.LockBuffer(),strlen(str)+1,NULL);

HMODULE KHandle = LoadLibrary(“Kernel32.dll”);

LPTHREAD_START_ROUTINE LBAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(KHandle,”LoadLibraryA”);

HANDLE remoteHandle = CreateRemoteThread(ProcHandle,NULL,NULL,LBAddress,VirAddress,NULL,NULL);

WaitForSingleObject(remoteHandle,INFINITE);

CloseHandle(remoteHandle);

CloseHandle(ProcHandle);

取消注入:

取消的方法: FreeLibrary  以上一样

【c++】 vc6.0 sdk

微软已经不再对 VC6 支持了,最新的 SDK 已经不能在 VC6 上使用。但是还是可以找到支持 VC6 的最后两个版本:
For Server2003 3790.0 RTM: Size (bytes): 342,000,000 Last Updated: February 2003
For XPSP2 2600.2180 RTM: Size (bytes): 266,000,000 Last Updated: August 2004

在这里感谢网友发现的下载地址:

Platform SDK XP-SP2:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.1.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.2.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.3.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.4.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.5.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.6.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.7.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.8.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.9.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.10.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/Extract.exe
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.bat
Platform SDK February 2003:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.1.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.2.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.3.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.4.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.5.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.6.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.7.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.8.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.9.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.10.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.11.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.12.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.13.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.bat
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/Extract.exe

 

 

【C#】应用IHTMLDocument2编程实现网页表单数据的自动提交

MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.MSHTML对象模型是由一些对象和集合组成的.处于根部的是HTML,描述了打开页面的1个窗口,包括一系列集合和对象。如Frames集合,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描述呈现在客户窗口实际网页的是Document对象。由一系列的属性、方法、对象和集合组成.其中All集合中包含网页中所有标记(Tag)元素,其主要的方法和属性有:
(1)Length(长度):即标记出现的个数,可以把标记的集合理解为从0开始的一维数组,其次序按照标记在网页位置排列;
(2)Tags(标记):用于过滤出给定标记的集合,如Doc.Al1.Tags(P)得到所有分段标记P;
(3)Item(项目):用于选择集合中的某1个元素,如object.item(0)得到集合的第1个元素,而object.item(i)得到第i+1个元素.
此外,IHTMLElement也是个常用的集合对象,代表网页中指定标记的集合,通过这个集合对象,可以得到网页上特定标记的内容.IHTMLElement有4个主要属性:
(1)InnerText:开始标记和结束标记之间的文本;
(2)InnerHTML:开始标记和结束标记之间的文本和HTML;
(3)OuterText:对象的文本;
(4)OuterHTML:对象的文本和HTML.

C# 实现基本思路为:使用从CDHtmlDialog或者CHtmlView继承的类来创建一个浏览器窗口,并打开你指定的URL。
在DocumentComplete事件(虚函数)中获得浏览器容器的IHTMLDocument2接口(文档接口)。
从文档接口中扫描DOM树,寻找你希望的FORM元素。
扫描FORM中的各个IHTMLInputElement,如果是你希望赋值的,就执行IHTMLInputElement::put_Value()赋值。
调用IHTMLFormElement::submit()方法实现提交

C#例程:
使用ihtmldocument2的类去控制。

1、添加引用。

在COM中,选择Microsoft.mshtml

2、使用命名空间。

using mshtml;

3、具体代码。

IHTMLDocument2 doc = (IHTMLDocument2)this.webBrowser1.Document.DomDocument;

mshtml.HTMLInputTextElement text1;

text1 = (HTMLInputTextElement)doc.all.item( “username “, 0);
((mshtml.HTMLInputElement)(text1)).value = “warran “;

//这里注意,因为是input输入框,所以要定义HTMLInputTextElement类

text1 = (HTMLInputTextElement)doc.all.item( “password “, 0);
((mshtml.HTMLInputElement)(text1)).value = “123456 “;

mshtml.HTMLFormElement f1 = (mshtml.HTMLFormElement)doc.all.item( “form1 “, 0);
((HTMLFormElement)(f1)).submit();

//因为是form表单,所以要定义HTMLFormElement类

DELPHI 例程

procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
input:OleVariant;
userinputelement,pwdinputelement:ihtmlinputelement;
begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item(‘user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item(‘password’,0) as ihtmlinputelement);
pwdinputelement.value:=edit2.text;
input:=doc.all.item(‘submit’,0);
input.click;
end;

当提交数据按钮没有NAME属性时,采用如下方法:
procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
form:ithmlformelement;
userinputelement,pwdinputelement:ihtmlinputelement;

begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item(‘user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item(‘password’,0) as ihtmlinputelement);
pwdinputelement:=edit2.text;
form:=(doc.all.item(‘login_form’,0) as ihtmlformelement):
form.submit;
end;

登录”按钮一般都是网页中默认的回车按钮,所以可以用上面代码来代替前面的点击按钮.

【c++】怎样在MFC中调用C#编写的DLL

一、使用 /clr 编译 MFC 可执行文件或规则 DLL
1、打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”。
2、展开“配置属性”旁边的节点并选择“常规”。在右侧窗格中的“项目默认值”下,将“公共语言运行库支持”设置为“公共语言运行库支持 (/clr)”。
3、在相同的窗格中,确保将“MFC 的使用”设置为“在共享 DLL 中使用 MFC”。
4、在“配置属性”下,展开“C/C++”旁边的节点并选择“常规”。请确保将“调试信息格式”设置为“程序数据库 /Zi”(而不是“/ZI”)。
5、在“配置属性”下,选择“C/C++”,然后选择“代码生成”。请确保将“运行时库”设置为“多线程调试 DLL (/MDd)”或“多线程 DLL (/MD)”之一。
二、在代码引用需要的dll
#using
#using “DownloaFiles.dll” //换成需要的dll文件
using namespace System;
using namespace CGistarMath;//换成dll中类所使用的namespace
三、在dll函数调用代码前加入#pragma managed
这是manage和unmanage混合编程在MFC下的一种实现方式。

以下是我自己碰到的问题的总结:
当我在声明一个变量的时候,是在.H文件的类里面声明: CGistarMath^ CSPro;
但是编译的时候会出现这个错误:
error C3265: 无法声明托管“CSPro”(在非托管“CMathCPPDlg”中)
不能声明全局或静态变量,也不能声明引用 gc 堆中对象的本机类型成员
因此,我只能讲CGistarMath^ CSPro修改成 CGistarMath^ CSPro = gcnew CGistarMath();并且放入函数的实现当中,才将该问题解决,但是有个缺点就是需要使用到该DLL的函数都要自己生面一个对象,比较麻烦,也容易造成资源浪费。