首页
社区
课程
招聘
[求助]谁有屏幕查看的 C or Asm 代码?
发表于: 2007-5-15 20:40 6829

[求助]谁有屏幕查看的 C or Asm 代码?

2007-5-15 20:40
6829
学校叫俺写的那个远程管理程序差不多了,用汇编写(其实我想也用VC,就不会)

领导不知道哪跟筋抽风了,要我加个屏幕查看.

     
     这个屏幕查看我一般是这样想:先获取桌面,然后把数据send到客户端,客户端负责解析成图片 显示出来,接着每1,2秒就发送一次数据,客户端再还原,这样很多图片重叠就可以了.

     很多VC的代码我都有,可偏偏就会C和汇编.我一见到CGetScreenInfo::~CGetScreenInfo(void)类似这样的函数就头疼.~ 这个符号都不知道什么意思.

     也怪俺学艺不精,很多VC里的代码都不知道怎么用汇编写.又碰到6月份了,要高考了    大大们抽点时间,丢几个汇编代码上来借鉴一下,感激呀..

丢个C的部分代码

//图形转换
HANDLE DDBtoDIB( HBITMAP bitmap)
{
        BITMAP                                bm;
        BITMAPINFOHEADER        bi;
    LPBITMAPINFOHEADER         lpbi;
        DWORD                                dwLen;
        HANDLE                                hDib;
        HANDLE                                handle;
        HDC                                 hdc;
        HPALETTE                        hPal;

        hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );

        //获得位图信息
        GetObject(bitmap,sizeof(bm),(LPSTR)&bm);

        // 初始化位图头信息
        bi.biSize                        = sizeof(BITMAPINFOHEADER);
        bi.biWidth                        = bm.bmWidth;
        bi.biHeight                 = bm.bmHeight;
        bi.biPlanes                 = 1;

        bi.biBitCount                = 4;
        bi.biCompression        = BI_RGB;
        bi.biSizeImage                = 0;
        bi.biXPelsPerMeter        = 0;
        bi.biYPelsPerMeter        = 0;
        bi.biClrUsed                = 0;
        bi.biClrImportant        = 0;

        int ncolors = (1 << bi.biBitCount);
        if( ncolors> 256 )
                ncolors = 0;
        dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD);

        hdc = GetDC(NULL);
        hPal = SelectPalette(hdc,hPal,FALSE);
        RealizePalette(hdc);

        hDib = GlobalAlloc(GMEM_FIXED,dwLen);

        if (!hDib){
                SelectPalette(hdc,hPal,FALSE);
                ReleaseDC(NULL,hdc);
                return NULL;
        }

        lpbi = (LPBITMAPINFOHEADER)hDib;

        *lpbi = bi;

        GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
                        (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );
/*
DDBtoDIB proc bitmap:LPSTR
local bm:BITMAP
local bi:BITMAPINFOHEADER
local hPal,hdc,ncolors
local dwLen:DWORD
local lpbi:DWORD

invoke GetStockObject,DEFAULT_PALETTE
mov hPal,eax
invoke GetObject,bitmap,sizeof bm,addr bm
mov        bi.biSize,sizeof BITMAPINFOHEADER
mov        bi.biWidth,bm.bmWidth
mov        bi.biHeight,bm.bmHeight
mov        bi.biPlanes,1

mov        bi.biBitCount,4
mov        bi.biCompression,BI_RGB
mov        bi.biSizeImage,0
mov        bi.biXPelsPerMeter,0
mov        bi.biYPelsPerMeter,0
mov        bi.biClrUsed,0
mov        bi.biClrImportant0

mov bi.biBitCount,1
lea ncolors,bi.biBitCount
.if ncolors > 256
mov ncolors,0
add bi.biSize,ncolors*sizeof RGBQUAD
lea dwLen,bi.biSize
.endif
invoke GetDC,NULL
mov hdc,eax
invoke SelectPalette,hdc,hPal,FALSE
invoke RealizePalette,hdc
invoke GlobalAlloc,GMEM_FIXED,addr dwLen
.if !eax
invoke SelectPalette,hdc,hPal,FALSE
invoke ReleaseDC,NULL,hdc
ret
.endif
push bi
pop lpbi
invoke GetDIBits,hdc,bitmap,0L,addr bi.biHeight,NULL,addr lpbi,DIB_RGB_COLORS

下面不会用汇编写了 */

        bi = *lpbi;

        if (bi.biSizeImage == 0)
        {
                bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
                                                * bi.biHeight;
        }

        dwLen += bi.biSizeImage;
        if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
                hDib = handle;
        else
        {
                GlobalFree(hDib);

                SelectPalette(hdc,hPal,FALSE);
                ReleaseDC(NULL,hdc);
                return NULL;
        }

        lpbi = (LPBITMAPINFOHEADER)hDib;

        BOOL bgotbits = GetDIBits( hdc, bitmap,
                                0L,                                                               
                                (DWORD)bi.biHeight,                               
                                (LPBYTE)lpbi                                
                                + (bi.biSize + ncolors * sizeof(RGBQUAD)),
                                (LPBITMAPINFO)lpbi,                               
                                (DWORD)DIB_RGB_COLORS);               

        if( !bgotbits )
        {
                GlobalFree(hDib);
               
                SelectPalette(hdc,hPal,FALSE);
                ReleaseDC(NULL,hdc);
                return NULL;
        }

        SelectPalette(hdc,hPal,FALSE);
        ReleaseDC(NULL,hdc);

        return hDib;
}

PS:貌似有本书叫<远程管理程序编写>   等高考过来再买来看看

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 642
活跃值: (2882)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
不要每次都截全屏发送,只发送改动过的部分,以提高效率.
PS:那个获取IE编辑框里的内容怎么没下文了?很想学习那个.....
如果可以,望能提供我份源码.tks
2007-5-15 22:39
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
"不要每次都截全屏发送,只发送改动过的部分,以提高效率"  

这里我还不怎么懂。估计要看很多代码。郁闷

"那个获取IE编辑框里的内容怎么没下文了?很想学习那"

那个其实我也没有源码,只是一个程序,反汇编才明白一点点 主要的核心代码是下面,csdn上看到的,非常类似。随便附上个样本,你分析分析

IE跳转时不调用API的,调用的都是webbrower控件的事件.你可以获取IHTMLDocument2指针,然后枚举所有Frame:   
   
  void   EnumFrame(   IHTMLDocument2   *   pIHTMLDocument2   )   
  {   
  if   (   !pIHTMLDocument2   ) return;   
   
  HRESULT   hr;   
   
  CComPtr<   IHTMLFramesCollection2   >   spFramesCollection2;   
  pIHTMLDocument2->get_frames(   &spFramesCollection2   ); //取得框架frame的集合   
   
  long   nFrameCount=0; //取得子框架个数   
  hr   =   spFramesCollection2->get_length(   &nFrameCount   );   
  if   (   FAILED   (   hr   )   ||   0   ==   nFrameCount   ) return;   
   
  for(long   i=0;   i<nFrameCount;   i++)   
  {   
  CComVariant   vDispWin2; //取得子框架的自动化接口   
  hr   =   spFramesCollection2->item(   &CComVariant(i),   &vDispWin2   );   
  if   (   FAILED   (   hr   )   ) continue;   
   
  CComQIPtr<   IHTMLWindow2   >   spWin2   =   vDispWin2.pdispVal;   
  if(   !spWin2   ) continue; //取得子框架的   IHTMLWindow2   接口   
   
  CComPtr   <   IHTMLDocument2   >   spDoc2;   
  spWin2->get_document(   &spDoc2   ); //取得子框架的   IHTMLDocument2   接口   
   
  EnumForm(   spDoc2   ); //递归枚举当前子框架   IHTMLDocument2   上的表单form   
  }   
  }   
   
  //然后每个Frame里都枚举From,并枚举所有元素:   
  //你只需要再判断是否为用户名输入框及密码输入框,即可,然后替换其文字   
  //代码后面,已经帮处理了其它所有工作,你只要pForm->submit();即可   
  //这样的提交可是IE真实的提交动作,并非你上面想要的"替换方法获得的提交结果"   
  //所以这种方法可以说是完美的,唯一不足的地方就是,名字输入框等只能靠一些通用的命名文式命名的才能确定是名字输入框,例如,我将输入框命名为USERNAME或USERID或LOGINNAME,LOGINID等都可以一下就确认是名字输入框,但如果有些人比较BT,命名为RegNumber(注册号)即以注册号作为用户名登录或学号(StudentNo)等作为用户名,你就分辩率不出来了,所以这种情况下就不如"替换方法获得的提交结果"的方法来得正确.   
  //对输入框的判断就留给你自己了,思路及代码已经很完整了,我想应该没有什么问题了.   
  //祝成功!   
  void   EnumForm(   IHTMLDocument2   *   pIHTMLDocument2   )   
  {   
  if(   !pIHTMLDocument2   ) return;   
          USES_CONVERSION;   
  EnumFrame(   pIHTMLDocument2   ); //递归枚举当前   IHTMLDocument2   上的子框架fram   
   
  CComQIPtr<   IHTMLElementCollection   >   spElementCollection;   
  hr   =   pIHTMLDocument2->get_forms(   &spElementCollection   ); //取得表单集合   
  if   (   FAILED(   hr   )   )   
  {   
  cout   <<   _T("获取表单的集合   IHTMLElementCollection   错误")   <<   endl;   
  return;   
  }   
   
  long   nFormCount=0; //取得表单数目   
  hr   =   spElementCollection->get_length(   &nFormCount   );   
  if   (   FAILED(   hr   )   )   
  {   
  cout   <<   _T("获取表单数目错误")   <<   endl;   
  return;   
  }   
   
  for(long   i=0;   i<nFormCount;   i++)   
  {   
  IDispatch   *pDisp   =   NULL; //取得第   i   项表单   
  hr   =   spElementCollection->item(   CComVariant(   i   ),   CComVariant(),   &pDisp   );   
  if   (   FAILED(   hr   )   ) continue;   
   
  CComQIPtr<   IHTMLFormElement   >   spFormElement   =   pDisp;   
  pDisp->Release();   
   
  long   nElemCount=0; //取得表单中   域   的数目   
  hr   =   spFormElement->get_length(   &nElemCount   );   
  if   (   FAILED(   hr   )   ) continue;   
   
  for(long   j=0;   j<nElemCount;   j++)   
  {   
  CComDispatchDriver   spInputElement; //取得第   j   项表单域   
  hr   =   spFormElement->item(   CComVariant(   j   ),   CComVariant(),   &spInputElement   );   
  if   (   FAILED(   hr   )   ) continue;   
   
  CComVariant   vName,vVal,vType; //取得表单域的   名,值,类型   
  hr   =   spInputElement.GetPropertyByName(   L"name",   &vName   );   
  if(   FAILED(   hr   )   ) continue;   
  hr   =   spInputElement.GetPropertyByName(   L"value",   &vVal   );   
  if(   FAILED(   hr   )   ) continue;   
  hr   =   spInputElement.GetPropertyByName(   L"type",   &vType   );   
  if(   FAILED(   hr   )   ) continue;   
   
  LPCTSTR   lpName   =   vName.bstrVal?   
  OLE2CT(   vName.bstrVal   )   :   _T("NULL"); //未知域名   
  LPCTSTR   lpVal     =   vVal.bstrVal?   
  OLE2CT(   vVal.bstrVal     )   :   _T("NULL"); //空值,未输入   
  LPCTSTR   lpType   =   vType.bstrVal?   
  OLE2CT(   vType.bstrVal   )   :   _T("NULL"); //未知类型   
   
  cout   <<   _T("[")   <<   lpType   <<   _T("]   ");   
  cout   <<   lpName   <<   _T("   =   ")   <<   lpVal   <<   endl;   
   
  }   
   
  //这里提交这个表单   
  pForm->submit();   
   
   
  }   
  }
上传的附件:
2007-5-15 23:08
0
雪    币: 642
活跃值: (2882)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
1."不要每次都截全屏发送,只发送改动过的部分,以提高效率"
远程控制监控俺也没写过,这只是一个想法而已...俺也没实现过.

2.C语言还没学几天呢...啥都不会
俺还是"静静得"等你的ASM源码
--------
其实ASM里面就是不会获取IHTMLDocument2指针,不然应该就啥都好办了....汗啊..

再给你个VC++的源码 应该对你有帮助:
http://www.evget.com/article/read_1470.aspx
2007-5-15 23:39
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
用asm来搞com编程,俺一点都不会

"其实ASM里面就是不会获取IHTMLDocument2指针"

我给的样本,反汇编一下估计可以了..

俺现在忙着写远程管理,估计这个获取IE编辑框内容的代码,估计木着落
2007-5-16 00:52
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
 

回到主题...

用TCP/IP,连接成功后,服务端发送桌面,客户端接收并解析成图片....

我这里有个例子,就是VC写的,控件太多,多余的东西也太多,我看得都郁闷了.

如果您有空捏,帮我把多余的代码去掉,仅仅留那个屏幕查看的功能...剩下的我自己来改 :-)

  如果您更有空,去掉之后捏,能帮我用asm写一下,那我太感谢你了.... 

如果实在不行,那我只好采用VC/asm混合编程来搞.

代码:http://www.asm32.cn/远程管理.rar
2007-5-16 01:18
0
雪    币: 642
活跃值: (2882)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
VC俺不行..帮不了你了
附件中有个VC的程序,就单单一个屏幕监控的功能,你看一下吧. (期待你的纯ASM版 )

另外帮你找了点资料,呵呵

大概的逻辑流程如下:

获取屏幕 DC
HDC hdcScreen = CreateDC( "DISPLAY", NULL, NULL, NULL );

创建一个 HBITMAP, 然后获得相应的 BITMAPINFOHEADER, 以及位图的像素.
GDI 中有几种办法可以做到,下面是其中一种。
用这个函数: CreateDIBSection
HBITMAP hbmp = CreateDIBSection( ... )

这个函数创建一个 HBITMAP,函数为你分配内存,成功后返回一个 HBITMAP。这个 HBITMAP 资源得由你来释放,用 DeleteObject

创建个与 hdcScreen 兼容的内存 DC
HDC hdcMemory = CreateCompatibleDC( hdcScreen );

将位图 HBITMAP 选入 hdcScreen
SelectObject( hdcMemory, hbmp )

用 BitBlt 函数将屏幕的内容复制到内存DC上,同时,hbmp 会被赋予相同的像素, 这样屏幕内容被保存下来了,并且其像素可以通过 HBITMAP 访问

使用 GetDIBSection 获取 HBITMAP 的所有信息,包括 BITMAPINFOHEADER, 像素数据,如果一个像素 8 位深,还得用 GetDIBColorTable 获取它的颜色表.

最后,将这些数据发送出去。

成功接收所有数据后,GDI 提供几种办法把数据绘制到窗口上。
下面是其中一种:

用函数 SetDIBitsToDevice 将接收到的像素数据直接拷到 DC 句柄上。可以是屏幕 DC 句柄。

:)
上传的附件:
2007-5-17 00:13
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
貌似连接不了......超时
2007-5-17 01:44
0
雪    币: 642
活跃值: (2882)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
我在虚拟机里测试过,本机自连的,收到一幅图后Server就挂了....貌似有点BUG
呵呵 研究下代码吧
2007-5-17 01:51
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
10
下面这段代码用汇编怎么整?偶没见过,尤其是 bi.biWidth * bi.biBitCount) + 31) & ~31 这小段代码.....

lpbi = (LPBITMAPINFOHEADER)hDib;
*lpbi = bi;
GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
                        (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );
bi = *lpbi;

        if (bi.biSizeImage == 0)
        {
                bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
                                                * bi.biHeight;
        }

        dwLen += bi.biSizeImage;
2007-5-17 03:31
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
花了点时间,整理一下SockClient.cpp,转成汇编.....可惜功底不深,很多东西都无法完成,只能C/ASM混合编程了.......SockServer.cpp 我还没写,所以SockClient.asm就无法调式了....郁闷  哪位大大帮忙写一下SockServer.cpp?

SockClient.asm:

.386
.model   flat,stdcall
option   casemap:none
include   windows.inc
include   user32.inc
include   kernel32.inc
include   wsock32.inc
include   Ws2_32.inc

includelib   user32.lib
includelib   kernel32.lib
includelib   wsock32.lib
includelib   Ws2_32.lib

MAJOR_VERSION   equ 1
MINOR_VERSION   equ 12
WM_SOCK         equ 280
US_MAXSIZ       equ 1024

US_FLAG       equ 9999
US_MOUSEMOVE       equ 2000
US_MOUSELD       equ 3100
US_MOUSELU       equ 3200
US_MOUSERD       equ 4100
US_MOUSERU       equ 4200

US_DESKTOPBIT       equ 5000

US_LOCK       equ 6100
US_UNLOCK       equ 6200

MouseMove proto :DWORD
MouseLD proto :DWORD
MouseLU proto :DWORD
MouseRD proto :DWORD
MouseRU proto :DWORD

.data?
ClientSock SOCKET ?
@stAddr sockaddr_in<?>
lpWSADATA WSADATA<?>
SysWidth dd ?
SysHeight dd ?
FALG DWORD ?
NewSock SOCKET ?
iMsg DWORD ?
point POINT<?>
x1 db 156 dup(?)
y1 db 156 dup(?)
hPoint POINT<?>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
InISock proc

invoke WSAStartup,202,addr lpWSADATA
.if eax!=NULL
mov eax,FALSE
.elseif
mov eax,TRUE
.endif
InISock endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ConnectSock proc

invoke socket,AF_INET,SOCK_STREAM,0
.if eax==INVALID_SOCKET
mov eax,FALSE
.endif
mov ClientSock,eax
mov ax,AF_INET
mov @stAddr.sin_family,ax
mov @stAddr.sin_addr,INADDR_ANY
invoke htons,7016
mov @stAddr.sin_port,ax
invoke  bind,ClientSock,addr @stAddr,sizeof @stAddr
.if eax==NULL
mov eax,FALSE
.endif
invoke listen,ClientSock,1
.if eax!=NULL
mov eax,FALSE
.elseif
mov eax,TRUE
.endif
ret
ConnectSock endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AcceptData proc
invoke accept,ClientSock,addr @stAddr,sizeof @stAddr
.if eax<0
invoke closesocket,ClientSock
mov eax,FALSE
.endif
mov NewSock,eax
invoke GetSystemMetrics,SM_CXSCREEN
mov SysWidth,eax
invoke GetSystemMetrics,SM_CYSCREEN
mov SysHeight,eax
mov eax,TRUE
ret
AcceptData endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetMousePoint proc hPoint1:DWORD
invoke recv,NewSock,addr x1,sizeof x1,0
invoke recv,NewSock,addr y1,sizeof y1,0
invoke lstrcpy,addr point.x,addr x1
invoke lstrcpy,addr point.y,addr y1
invoke lstrcpy,addr hPoint1,addr point
ret
GetMousePoint endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetData proc

mov FALG,US_FLAG
invoke send,NewSock,addr FALG,sizeof FALG,MSG_OOB
invoke recv,NewSock,addr iMsg,sizeof iMsg,0
.if eax<NULL
invoke closesocket,NewSock
invoke closesocket,ClientSock
mov eax,FALSE
.endif
.if iMsg<4500
invoke send,NewSock,addr SysWidth,sizeof SysWidth,MSG_OOB
invoke send,NewSock,addr SysHeight,sizeof SysHeight,MSG_OOB
invoke GetMousePoint,addr hPoint
.if iMsg==US_DESKTOPBIT
;invoke SendDesktop  ;这里采用C/ASM混合编程.
.elseif iMsg==US_MOUSEMOVE
invoke MouseMove,addr hPoint
.elseif iMsg==US_MOUSELD
invoke MouseLD,addr hPoint
.elseif iMsg==US_MOUSELU
invoke         MouseLU,addr hPoint
.elseif iMsg==US_MOUSERD
invoke MouseRD,addr hPoint
.elseif iMsg==US_MOUSERU
invoke MouseRU,addr hPoint
.elseif iMsg==US_LOCK
;invoke SysEvent,US_LOCK ;这里采用C/ASM混合编程
.elseif iMsg==US_UNLOCK
;invoke SysEvent,US_UNLOCK ;这里采用C/ASM混合编程
.endif
.endif
mov eax,TRUE
ret
GetData endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MouseMove proc _lpPoint:DWORD
push esi
mov esi,_lpPoint
assume esi:ptr POINT
invoke SetCursorPos,addr [esi].x,addr [esi].y
assume esi:nothing
pop esi
ret
MouseMove endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MouseLD proc _lpPoint:DWORD
push esi
mov esi,_lpPoint
assume esi:ptr POINT
invoke mouse_event,MOUSEEVENTF_LEFTDOWN,addr [esi].x,addr [esi].y,0,0
assume esi:nothing
pop esi
ret
MouseLD endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MouseLU proc _lpPoint:DWORD
push esi
mov esi,_lpPoint
assume esi:ptr POINT
invoke mouse_event,MOUSEEVENTF_LEFTUP,addr [esi].x,addr [esi].y,0,0
assume esi:nothing
pop esi
ret
MouseLU endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MouseRD proc _lpPoint:DWORD
push esi
mov esi,_lpPoint
assume esi:ptr POINT
invoke mouse_event,MOUSEEVENTF_RIGHTDOWN,addr [esi].x,addr [esi].y,0,0
assume esi:nothing
pop esi
ret
MouseRD endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MouseRU proc _lpPoint:DWORD
push esi
mov esi,_lpPoint
assume esi:ptr POINT
invoke mouse_event,MOUSEEVENTF_RIGHTUP,addr [esi].x,addr [esi].y,0,0
assume esi:nothing
pop esi
ret
MouseRU endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:
         invoke InISock
         .if !eax
         mov eax,FALSE
         .endif
         invoke ConnectSock
         .if !eax
         mov eax,FALSE
         .endif
         .while TRUE
         invoke AcceptData
         .if !eax
         invoke WSACleanup
         .endif
         .endw
         end start
2007-5-17 06:30
0
游客
登录 | 注册 方可回帖
返回
//