我收集的C++实例Word文件下载.docx
- 文档编号:16171236
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:19
- 大小:46.65KB
我收集的C++实例Word文件下载.docx
《我收集的C++实例Word文件下载.docx》由会员分享,可在线阅读,更多相关《我收集的C++实例Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
structin_addraddr;
memcpy(&
addr,phe->
h_addr_list[i],sizeof(structin_addr));
Address%d:
i,inet_ntoa(addr));
return0;
intmain(intargc,char*argv[])
WSADatawsaData;
if(WSAStartup(MAKEWORD(1,1),&
wsaData)!
=0){
return255;
intretval=doit(argc,argv);
WSACleanup();
returnretval;
用VC++编译广告屏蔽软件
一、程序设计思路与实现首先要分析一下广告窗口的一般特性。
广告窗口一般是通过主页面里的Javascript脚本或VBScript脚本语言来动态弹出的,其实质还是一个IE窗口。
但绝大多数窗口在创建出来后是没有菜单,工具条等其它东西的,因此我们可以先搜寻IE窗口,然后判断其窗口是否有菜单和工具条等东西,如果没有就认为是广告窗口了,虽然这样的判断不是十分的严格,但从实际使用情况来看虽然有时会误关一些正常窗口,但发生的几率是相当小的。
完全可以忽略。
而且这种情况多发生在聊天室中,所以只需在聊天之前将其关闭,只在浏览网页的时候运行程序就一般不会发生误操作了。
程序的实现并不复杂,由于程序运行起来后任意时刻弹出的广告窗体都要随时关闭,所以就应当通过设置定时器,每隔一段时间就搜寻以下当前是否有广告窗口,如果有就将其关闭,否则继续监视。
因此可以在程序的初始化入口函数中用SetTimer()函数启动定时器。
下面就结合实际代码对部分关键代码进行讲解:
从第一个窗口开始对每一个窗口进行枚举搜索,如果第一个窗口存在那么就可以通过在while循环里的GetWindow(GW_HWNDNEXT);
来搜寻下一个窗口,并在其内判断是否是广告窗体,直至搜寻完最后一个窗体为止:
对于判断是否是广告窗口,可以用GetClassName()函数获取窗口类型来判断是否是IE窗口:
CStringstrClassName;
GetClassName(pMainWnd->
m_hWnd,strClassName.GetBufferSetLength(100),100);
对于那些不是IE类型的窗体根本不用加以考虑,可以将刚才得到的strClassName窗口类型同"
IEFrame"
进行比较来进行判断,如果是IE窗口才可以进行下一步的判断:
//根据句柄获取子窗口指针
CWnd*pChildWnd=CWnd:
:
FromHandle(FindWindowEx(pMainWnd->
m_hWnd,NULL,"
Worker"
NULL));
if(!
pChildWnd)
pChildWnd=CWnd:
WorkerA"
如果子窗口存在,用类似的方法获取下一个子窗口指针:
CWnd*pChildNextWnd=CWnd:
m_hWnd,pChildWnd->
m_hWnd,"
pChildNextWnd)
pChildNextWnd=CWnd:
如果该窗口存在,那么下步只要验证当前窗口可视就可以断定其的确属于广告窗口,可以通过GetWindowLong()获取到当前的窗口风格,然后通过逻辑运算可以判断出当前窗口是否具有WS_VISIBLE可视效果:
if(pChildNextWnd)
if(!
(GetWindowLong(pChildWnd->
m_hWnd,GWL_STYLE)&
WS_VISIBLE))
{
pTempWnd=NULL;
pTempWnd=pMainWnd;
//关闭广告窗口
……
return;
}
现在已经可以准确判断出哪个是广告窗口了,只需将其关闭即可,前段代码已经将我们想关闭的窗口指针保存到变量pTempWnd中,因此我们可以通过简单的向其发送WM_CLOSE消息就可以彻底将其关闭了:
pTempWnd->
PostMessage(WM_CLOSE,0,0);
二、小结
本文仅对于关闭广告窗口的核心代码作了介绍,在实际编程中需要考虑到许多实际的因素,比如为了节省屏幕占用空间,最好将其做成系统托盘模式;
由于需要长期驻留内存所以要尽量把程序大小控制好,并且采用Release发行版本等等。
本文所述内容有一定的通用性,可以将其用于监视某项进程,当该进程启动后由程序来触发某个事件来对其进行处理等等。
一个简单的外挂制作
引言:
最近在朋友那搞了个连连看游戏来玩玩,觉得还不错,不过就是玩不过人家,记得以前在一本书上看到过连连看外挂的做法,还比较简单,自己还没忘,于是下定决心,自己做一个,然后……。
哈哈,看谁还打得过我。
好了,现在说下外挂的具体思路(我假设大家都知道连连看游戏的规则)。
这个外挂无非就是要电脑来帮我门找到相同的图片并看他们是否连通。
这里有两个问题,一个就是怎么让电脑区别不同的图片呢?
这里有个简单的办法,就是在每个图片中取5个点,然后将这5个点的像素值相加做为这种图片的ID,这样一般不会出现重复的ID,如下图所示例:
这样第一个问题就解决了,第二个问题就是怎么判断它们是否连通,这个您研究下代码就OK拉。
好了现在我们假设第二个问题已经解决了,那么,我们只需要往连连看游戏的窗口的两个相同且连通的图片的地方发送两个鼠标单击的消息就OK了或者在他们上面画两个圈提示以下。
下面是程序运行是的样子:
看到没,两个相同的图片被外挂程序标记了颜色。
或者你可以直接点击“自动消除”来自动消除两个图片。
编程实现:
这里有个难点,就是该连连看的游戏的背景不是单色的,是一幅图片,那我们怎么区分到底是背景还是前景的图片呢?
我这里采用了个笨办法,就是用调试的办法去跟踪,把每个区域的背景也生成了它们的ID,到时比较一下就是了。
这里就是我跟踪得到的数据,我把它门写到了数组里到时候用就是了。
相关代码如下:
//这里边放的是背景的ID
intBackGround[]={83886075,83886060,59434490,82188285,83820266,65305594,83754472,
79584810,82141361,71323293,79582750,79584250,75889042,83818977,62589434,
83175162,83332551,83553749,83818467,73624378,81705626,82759346,82496174,
82100272,81070586,81468437,83754215,83885803,77729230,73148330,78524918,
77217286,83754215,68069635,83597193,80299161,81172078,83027654,83503432,
83686365,65042170,59778810,62410490,83356632,67567649,83523625,81967762,
74584570,83885803,78520804,79577810,83027658,83818467,82220538,61620986,
83820266,83687393,83555050,83818222,83886072};
m_pBackGround=newint[BK_COUNT];
for(inti=0;
i<
BK_COUNT;
i++)
{
m_pBackGround[i]=BackGround[i];
} 下面的函数就是根据图片的行号和列号来生成图片的ID,如果是背景图片则返回一个标志。
//************该函数根据由x、y指定的行列返回该位置的方块的ID号
//如果是背景则返回BACKGROUND
intCLLK_CheatDlg:
GetRectData(intx,inty)
CPointptPos[5];
//五个像素点
COLORREFcolorData[5];
intnRetVal=0;
intbasicX,basicY;
//该方块左上角的坐标
basicX=x*BLOCK_WIDTH;
basicY=y*BLOCK_HEIGHT;
//取该方块的5个点判断
ptPos[0].x=basicX+BLOCK_WIDTH/2;
//中间点
ptPos[0].y=basicY+BLOCK_HEIGHT/2;
ptPos[1].x=ptPos[0].x;
//上边
ptPos[1].y=ptPos[0].y-5;
ptPos[2].x=ptPos[0].x;
ptPos[2].y=ptPos[0].y+5;
//下边
ptPos[3].x=ptPos[0].x-5;
ptPos[3].y=ptPos[0].y;
//左边
ptPos[4].x=ptPos[0].x+5;
//右边
ptPos[4].y=ptPos[0].y;
5;
colorData[i]=GetPixel(m_MemDC.m_hDC,ptPos[i].x,ptPos[i].y);
}
for(i=0;
nRetVal+=colorData[i];
if(nRetVal==m_pBackGround[i])
returnBACKGROUND;
returnnRetVal;
} 接下来是判断两个图片是否连通,代码如下:
BOOLCLLK_CheatDlg:
IsLink(intx1,inty1,intx2,inty2)
//X直连方式
if(x1==x2)
if(X1_Link_X2(x1,y1,y2))
returnTRUE;
//Y直连方式
elseif(y1==y2)
if(Y1_Link_Y2(x1,x2,y1))
//一个转弯直角的联通方式
if(OneCornerLink(x1,y1,x2,y2))
returnTRUE;
//两个转弯直角的联通方式
elseif(TwoCornerLink(x1,y1,x2,y2))
returnFALSE;
} 这下主要的工作已做的差不多了,接下来就是挨个查找相同的图片,并判断它们是否连通的,如果是则提示或者直接消除。
这样一个简单的外挂就做成了,是不是不敢相信?
其他的代码请查看源文件。
结束语
这个程序还有点小BUG,就是有时会查不到可以消除的图片,有可能就是获取背景图片的ID时没有获取到准确的值导致程序发送的消息得不到效果。
如果大家有好的办法可以自己去完善一下。
C++中控制Windows关机的实用技巧
我们在应用程序编制完成后,需要设计应用程序的包装和分发功能。
在编写安装程序时,经常会遇到这样的问题:
程序安装完成后需要重新启动计算机。
那么在代码中如何控制Windows的关机或重新启动呢?
要实现这个功能,需要用到WindowsAPI提供的一个ExitWindowsEx函数。
我们可以通过查看C++Builder提供的帮助文件得到这个函数的使用格式:
BOOLExitWindowsEx(
UINTuFlags,
//设置关机参数
DWORDdwReserved
//系统保留字
设置uFlags的参数说明:
EWX_FORCE 强制终止程序运行而退出系统
EWX_LOGOFF退出而以其它身份登录
EWX_REBOOT重新启动
EWX_SHUTDOWN关机
dwReserved是系统保留字,随便填入个0即可。
了解ExitWindowsEx函数的使用格式后,下面以实例说明在C++Builder中控制Windows关机或重新启动的方法。
设计步骤如下:
1.运行C++Builder系统后,先激活选单“File/NewApplication”,创建一个新工程。
2.激活选单“File/SaveAs”把窗体单元以文件名exitu.cpp存盘,然后激活选单“File/SaveProjectAs”把工程文件以文件名exitp.bpr存盘。
(注意:
工程文件名与窗体单元文件名不要同名。
)
3.在窗体上增加四个TButton组件Button1、Button2、Button3和Button4,分别设置它们的Caption属性为“其它身份登录”、“关机”、“重新启动”和“强制关机”。
4.分别设置Button1、Button2、Button3和Button4组件的OnClick事件响应代码如下:
void__fastcallTForm1:
Button1Click(TObjectSender)
{
//其它身份登录
DWORDtemp;
ExitWindowsEx(EWX_LOGOFF,temp);
}
//------------------------------
Button2Click(TObjectSender)
//关机
ExitWindowsEx(EWX_SHUTDOWN,temp);
Button3Click(TObjectSender)
//重新启动
ExitWindowsEx(EWX_REBOOT,temp);
Button4Click(TObjectSender)
//强制关机
ExitWindowsEx(EWX_FORCE,temp);
5.运行程序后,分别单击四个按钮测试它们的功能。
如果能完成各种设置的功能,说明你已成功了,那么就可以将本文介绍的方法运用到自己开发的C++Builder应用程序中去控制Windows的关闭了。
用VC++实现http代理
为了帮网友些个用http下载动画的程序,临时在网上翻了翻,看看有没有利用http代理来下载的例子。
结果,似乎很多人都愿意去转载一个有头无尾的例子,还美其名曰“我在查阅RFC文档和相关资料后,特总结一些TCP协议穿透代理服务器的程序片断,希望对大家有所帮助。
”
如果真的想帮助大家,为什么不说的详细一些?
无奈之下,自己去翻rfc文档,找了些资料,写了这个利用http代理来下载文件的资料
代码如下:
(1)一些基本变量
SOCKETHTTPSocket;
//主socket
structsockaddr_inSocketAddr;
//addresssocket
structsockaddr_inBindSocket;
//forbind
intm_nRecvTimeout;
//recievetimeout
intm_nSendTimeout;
//sendtimeout
WSADATAwsaData;
//要下载文件部分。
好像在BindSocket.sin_addr.s_addr=inet_addr(strHost);
时,只能使用ip地址,所以了。
。
//如果谁知道更好的方法,别忘了告诉我一下。
CStringstrHost="
111.111.111.111"
;
CStringDownLoadAddress="
CStringhostFile="
logo.gif"
intHttpPort=80;
(2)一些函数,用来取得http头,和获取文件大小
intGetFileLength(char*httpHeader)
CStringstrHeader;
intlocal;
strHeader=(CString)httpHeader;
local=strHeader.Find("
Content-Length"
0);
local+=16;
strHeader.Delete(0,local);
\r"
strHeader.SetAt(local,'
\0'
chartemp[30];
strcpy(temp,strHeader.GetBuffer(strHeader.GetLength()));
returnatoi(temp);
intGetHttpHeader(SOCKETsckDest,char*str)
BOOLm_bResponsed=0;
intm_nResponseHeaderSize;
m_bResponsed)
charc=0;
intnIndex=0;
BOOLbEndResponse=FALSE;
while(!
bEndResponse&
&
nIndex<
1024)
recv(sckDest,&
c,1,0);
str[nIndex++]=c;
if(nIndex>
=4)
if(str[nIndex-4]=='
\r'
&
str[nIndex-3]=='
'
str[nIndex-2]=='
str[nIndex-1]=='
bEndResponse=TRUE;
m_nResponseHeaderSize=nIndex;
m_bResponsed=TRUE;
returnm_nResponseHeaderSize;
(3)用来发送的部分
voidszcopy(char*dest,constchar*src,intnMaxBytes)
inti_cntr=0;
while((src[i_cntr]!
='
) (i_cntr
dest[i_cntr]=src[i_cntr++];
dest[i_cntr]='
BOOLSocketSend(SOCKETsckDest,constchar*szHttp)
charszSendHeader[MAXHEADERLENGTH];
intiLen=strlen(szHttp);
szcopy(szSendHeader,szHttp,iLen);
if(send(sckDest,(constcharFAR*)szSendHeader,iLen,0)==SOCKET_ERROR)
closesocket(sckDest);
AfxMessageBox("
Errorwhensend"
returnFALSE;
returnTRUE;
BOOLSocketSend(SOCKETsckDest,CStringszHttp)
intiLen=szHttp.GetLength();
if(send(sckDest,szHttp,iLen,0)==SOCKET_ERROR)
(4)用于连接的函数
这里是做了一些连接用的操作,分了两种情况
1)如果没有使用代理,则直接连到你指定的计算机
2)如果使用了代理,则直接连到代理
BOOLCDLAngelDlg:
ConnectHttp()
message="
正在建立连接"
UpdateData(TRUE);
if(m_co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 收集 C+ 实例