我手头有一个win32应用程序,
作为客户端,实现抓取客户端的屏幕.
现在我想在SDI里也要实现这个功能,不知这个win32程序能不能拿来用?????
win32的程序如下:
#include "stdafx.h"
#include "stdlib.h"
#include "resource.h"
#include "stdio.h"
#include "winsock2.h"
#include "conio.h"
#include "windows.h"
DWORD NewThreadId;
HWND hWnd1;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
int bool1;
DialogBox(hInstance, (LPCTSTR)IDD_DIALOG1,NULL, (DLGPROC)WndProc);
while ((bool1=GetMessage(&msg, NULL, 0, 0))!=0 && bool1!=-1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
DWORD ThreadFunc(char *IP_value)
{
unsigned long IP_A=(unsigned long)IP_value;
WSADATA a;
if(WSAStartup(MAKEWORD( 2, 2 ),&a)!=0)
{
MessageBox(NULL,"failure-load winsok", "Error", MB_OK);
return 0;
}
SOCKET client; //The socket used to link
sockaddr_in server_add ; //used in the function of connect
client=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(client==INVALID_SOCKET)
{
MessageBox(NULL,"failure-create winsok", "Error", MB_OK);
return 0;
}
//Psockaddr_in server_add;
server_add.sin_family=AF_INET;
server_add.sin_port=htons(5150);
server_add.sin_addr.S_un.S_addr=IP_A;//inet_addr("192.168.0.9");
if(connect(client,(sockaddr *)&server_add,sizeof(server_add))==SOCKET_ERROR)
{
MessageBox(NULL,"failure-connect", "Error", MB_OK);
return 0;
}
int count=0; //count the receive number of one time;
BITMAP bmp;
char *New_start;
char buf_recv[20000];
int counter=0; //count the total number of receive
char *Mem_real_pointer;
char *pointerMem;
int all_size;
count=recv(client,(char *)&bmp,sizeof(BITMAP),0);
if(count!=0 && count!=SOCKET_ERROR)
{
if(count==sizeof(BITMAP))
{
//allocat the buffer to receive the BMP data
all_size=bmp.bmWidthBytes*bmp.bmHeight;
pointerMem=(char *)GlobalAlloc(GMEM_FIXED,all_size);
Mem_real_pointer=(char *)GlobalLock(pointerMem);
if(Mem_real_pointer==NULL)
{
MessageBox(NULL,"Memory allocated failure", "Error", MB_OK);
//分配内存失败
}
else
{
//allocate success
counter=0;
count=0;
char *cpy_result;
while(counter<all_size)
{
New_start=(char *)((char *)Mem_real_pointer+counter);
count=recv(client,(char *)buf_recv,20000,0);
if(count==SOCKET_ERROR) //this indicate that the link is break up
{
break;
}
cpy_result=(char *)memcpy(New_start,buf_recv,count);
if(cpy_result!=New_start)
{
break;
}
counter=counter+count;
}
}
}
}
LPBITMAPINFO lpBmpInfo;
lpBmpInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)];
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biPlanes =bmp.bmPlanes;
lpBmpInfo->bmiHeader.biBitCount = bmp.bmBitsPixel;
lpBmpInfo->bmiHeader.biCompression = BI_RGB;
lpBmpInfo->bmiHeader.biSizeImage = 0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biWidth = bmp.bmWidth;
lpBmpInfo->bmiHeader.biHeight = bmp.bmHeight;
HDC hdc = CreateCompatibleDC(NULL);
LPVOID lpBits;
PBITMAP holdbmp,hbmp;
hbmp=(PBITMAP)CreateDIBSection(hdc,lpBmpInfo,DIB_RGB_COLORS,&lpBits,NULL,0);
delete lpBmpInfo;
DeleteDC(hdc);
if(hbmp==NULL)
MessageBox(NULL,"create BMP failure", "Error", MB_OK);
else
{
char *cpyresult;
cpyresult=(char *)memcpy(lpBits,Mem_real_pointer,all_size);
if(cpyresult!=lpBits)
{
printf("copy mem last failure!");
}
HDC dcImage=CreateCompatibleDC(NULL);
holdbmp=(PBITMAP)SelectObject(dcImage, hbmp);
GetObject(hbmp,sizeof(bmp),&bmp);
RECT ScreenSaved;
//get IDC_EDIT1 'S screen place coordinate
GetWindowRect(GetDlgItem(hWnd1,IDC_EDIT1),&ScreenSaved);
StretchBlt(GetWindowDC(GetDlgItem(hWnd1,IDC_EDIT1)),0,0,ScreenSaved.right-ScreenSaved.left,ScreenSaved.bottom-ScreenSaved.top,dcImage,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
SelectObject(dcImage, holdbmp);
DeleteDC(dcImage);
}
GlobalFree(pointerMem);
closesocket(client);
WSACleanup();
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// char string[100];
hWnd1=hWnd;
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BUTTON2)
{
EndDialog(hWnd, LOWORD(wParam));
return TRUE;
}
if(LOWORD(wParam) == IDC_BUTTON1)
{
unsigned long IP_value;
char string_IP[30];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT3),string_IP,30);
IP_value=inet_addr(string_IP);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadFunc,(LPVOID)IP_value,0,&NewThreadId);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
作为客户端,实现抓取客户端的屏幕.
现在我想在SDI里也要实现这个功能,不知这个win32程序能不能拿来用?????
win32的程序如下:
#include "stdafx.h"
#include "stdlib.h"
#include "resource.h"
#include "stdio.h"
#include "winsock2.h"
#include "conio.h"
#include "windows.h"
DWORD NewThreadId;
HWND hWnd1;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
int bool1;
DialogBox(hInstance, (LPCTSTR)IDD_DIALOG1,NULL, (DLGPROC)WndProc);
while ((bool1=GetMessage(&msg, NULL, 0, 0))!=0 && bool1!=-1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
DWORD ThreadFunc(char *IP_value)
{
unsigned long IP_A=(unsigned long)IP_value;
WSADATA a;
if(WSAStartup(MAKEWORD( 2, 2 ),&a)!=0)
{
MessageBox(NULL,"failure-load winsok", "Error", MB_OK);
return 0;
}
SOCKET client; //The socket used to link
sockaddr_in server_add ; //used in the function of connect
client=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(client==INVALID_SOCKET)
{
MessageBox(NULL,"failure-create winsok", "Error", MB_OK);
return 0;
}
//Psockaddr_in server_add;
server_add.sin_family=AF_INET;
server_add.sin_port=htons(5150);
server_add.sin_addr.S_un.S_addr=IP_A;//inet_addr("192.168.0.9");
if(connect(client,(sockaddr *)&server_add,sizeof(server_add))==SOCKET_ERROR)
{
MessageBox(NULL,"failure-connect", "Error", MB_OK);
return 0;
}
int count=0; //count the receive number of one time;
BITMAP bmp;
char *New_start;
char buf_recv[20000];
int counter=0; //count the total number of receive
char *Mem_real_pointer;
char *pointerMem;
int all_size;
count=recv(client,(char *)&bmp,sizeof(BITMAP),0);
if(count!=0 && count!=SOCKET_ERROR)
{
if(count==sizeof(BITMAP))
{
//allocat the buffer to receive the BMP data
all_size=bmp.bmWidthBytes*bmp.bmHeight;
pointerMem=(char *)GlobalAlloc(GMEM_FIXED,all_size);
Mem_real_pointer=(char *)GlobalLock(pointerMem);
if(Mem_real_pointer==NULL)
{
MessageBox(NULL,"Memory allocated failure", "Error", MB_OK);
//分配内存失败
}
else
{
//allocate success
counter=0;
count=0;
char *cpy_result;
while(counter<all_size)
{
New_start=(char *)((char *)Mem_real_pointer+counter);
count=recv(client,(char *)buf_recv,20000,0);
if(count==SOCKET_ERROR) //this indicate that the link is break up
{
break;
}
cpy_result=(char *)memcpy(New_start,buf_recv,count);
if(cpy_result!=New_start)
{
break;
}
counter=counter+count;
}
}
}
}
LPBITMAPINFO lpBmpInfo;
lpBmpInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)];
lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpBmpInfo->bmiHeader.biPlanes =bmp.bmPlanes;
lpBmpInfo->bmiHeader.biBitCount = bmp.bmBitsPixel;
lpBmpInfo->bmiHeader.biCompression = BI_RGB;
lpBmpInfo->bmiHeader.biSizeImage = 0;
lpBmpInfo->bmiHeader.biClrUsed = 0;
lpBmpInfo->bmiHeader.biWidth = bmp.bmWidth;
lpBmpInfo->bmiHeader.biHeight = bmp.bmHeight;
HDC hdc = CreateCompatibleDC(NULL);
LPVOID lpBits;
PBITMAP holdbmp,hbmp;
hbmp=(PBITMAP)CreateDIBSection(hdc,lpBmpInfo,DIB_RGB_COLORS,&lpBits,NULL,0);
delete lpBmpInfo;
DeleteDC(hdc);
if(hbmp==NULL)
MessageBox(NULL,"create BMP failure", "Error", MB_OK);
else
{
char *cpyresult;
cpyresult=(char *)memcpy(lpBits,Mem_real_pointer,all_size);
if(cpyresult!=lpBits)
{
printf("copy mem last failure!");
}
HDC dcImage=CreateCompatibleDC(NULL);
holdbmp=(PBITMAP)SelectObject(dcImage, hbmp);
GetObject(hbmp,sizeof(bmp),&bmp);
RECT ScreenSaved;
//get IDC_EDIT1 'S screen place coordinate
GetWindowRect(GetDlgItem(hWnd1,IDC_EDIT1),&ScreenSaved);
StretchBlt(GetWindowDC(GetDlgItem(hWnd1,IDC_EDIT1)),0,0,ScreenSaved.right-ScreenSaved.left,ScreenSaved.bottom-ScreenSaved.top,dcImage,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
SelectObject(dcImage, holdbmp);
DeleteDC(dcImage);
}
GlobalFree(pointerMem);
closesocket(client);
WSACleanup();
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// char string[100];
hWnd1=hWnd;
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BUTTON2)
{
EndDialog(hWnd, LOWORD(wParam));
return TRUE;
}
if(LOWORD(wParam) == IDC_BUTTON1)
{
unsigned long IP_value;
char string_IP[30];
GetWindowText(GetDlgItem(hWnd,IDC_EDIT3),string_IP,30);
IP_value=inet_addr(string_IP);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) ThreadFunc,(LPVOID)IP_value,0,&NewThreadId);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
解决方案 »
- BOOST中有res_init这样的函数吗?
- 怎样让用户只能访问浏览器
- dll
- 哪里有可编辑单元格的网格控件啊?
- 同志们,我连在Direct Draw中写行hello都搞不定啊!!
- CRichEditCtrl回滚的问题求助!
- 怎么样CToolsView : public CView 改为CToolsView : public CScrollView ,因为我最开始用的是CView,程序已经写好了,但最后需要改为CScr
- 我想做一个帮助文件,可是在建工程时没有选上有帮助文件的选项,该怎么办?
- 什么是回调函数?
- 求救!新建文件异常!
- 一个很奇怪的问题,web控件屏幕的刷新,分不够可以加!!!!
- 各位大侠,小女有一个难题,有关鼠标事件模拟问题
只需要吧main函数改成别的函数名,然后在你需要调用的地方调用即可。
又出现如下错误:
testView.obj : error LNK2001: unresolved external symbol __imp__WSACleanup@0
testView.obj : error LNK2001: unresolved external symbol __imp__closesocket@4
testView.obj : error LNK2001: unresolved external symbol __imp__recv@16
testView.obj : error LNK2001: unresolved external symbol __imp__connect@12
testView.obj : error LNK2001: unresolved external symbol __imp__htons@4
testView.obj : error LNK2001: unresolved external symbol __imp__socket@12
testView.obj : error LNK2001: unresolved external symbol __imp__WSAStartup@8
testView.obj : error LNK2001: unresolved external symbol __imp__inet_addr@4
Debug/test.exe : fatal error LNK1120: 8 unresolved externals
Error executing link.exe.
#pragma comment( lib, "ws2_32.lib" )
谢谢你啊
困扰我的问题终于解决了。你怎么知道要加#pragma comment( lib, "ws2_32.lib" ),是什么道理清楚嘛??不管怎样,
马上分数送上
咯咯………………