所以我有一个工作 HBITMAP 可以使用SetClipboardData
. 我想要做的是将 HBITMAP 发送到另一个应用程序(不向磁盘写入任何内容),它将接收它并能够像原始应用程序一样将其设置到剪贴板。我知道您不能只发送句柄,所以我使用GetObject
并GetDIBits
发送了收集的数据。我查看了所有其他人关于通过网络发送 hbitmaps 的 stackoverflow 问题,但没有一个给出的答案对我有用。
更新:更新后代码仍然无法正常工作。
这是我的代码现在的样子:
客户:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define Port 6000
SOCKET Socket, Sub;
WSADATA Winsock;
sockaddr_in Addr;
sockaddr_in IncomingAddress;
int AddressLen = sizeof(IncomingAddress);
BOOL send_function(BYTE* dib, int dib_size) {
WSAStartup(MAKEWORD(2, 2), &Winsock); // Start Winsock
if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) // Check version
{
WSACleanup();
return 0;
}
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ZeroMemory(&Addr, sizeof(Addr));
Addr.sin_family = AF_INET;
Addr.sin_port = htons(Port);
bind(Socket, (sockaddr*)&Addr, sizeof(Addr));
if (listen(Socket, 1) == SOCKET_ERROR)
{
printf("listening error\n");
}
else
{
printf("listening ok\n");
}
if (Sub = accept(Socket, (sockaddr*)&IncomingAddress, &AddressLen))
{
char* ClientIP = inet_ntoa(IncomingAddress.sin_addr);
int ClientPort = ntohs(IncomingAddress.sin_port);
printf("Client conncted!\n");
printf("IP: %s:%d\n", ClientIP, ClientPort);
printf("Sending data .. \n");
char bufsize[10];
sprintf(bufsize, "%d", dib_size);
send(Sub, (char*)bufsize, 10, 0);
send(Sub, (char*)dib, dib_size, 0);
closesocket(Sub);
closesocket(Socket);
WSACleanup();
}
}
int main()
{
HWND hwnd = GetWindow(GetForegroundWindow(), GW_HWNDLAST);
RECT rc;
GetWindowRect(hwnd, &rc);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);
//Print to memory hdc
PrintWindow(hwnd, hdc, NULL);
auto hcopy = (HBITMAP)CopyImage(hbmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(hcopy, sizeof(bm), &bm);
BITMAPINFOHEADER bi = { sizeof(bi) };
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biBitCount = bm.bmBitsPixel;
bi.biPlanes = bm.bmPlanes;
bi.biSizeImage = bm.bmWidthBytes * bm.bmHeight;
int dib_size = sizeof(bi) + bi.biSizeImage;
BYTE* dib = new BYTE[dib_size];
memcpy(dib, &bi, sizeof(bi));
memcpy(dib + sizeof(bi), bm.bmBits, bi.biSizeImage);
send_function(dib, dib_size);
//cleanup
DeleteObject(hcopy);
delete[]dib;
getchar();
return 0;
}
服务器:
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
SOCKET Socket;
WSADATA Winsock;
sockaddr_in Addr;
int Addrlen = sizeof(Addr);
void receive_function(BYTE* dib, int dib_size)
{
BITMAPINFOHEADER* bi = (BITMAPINFOHEADER*)dib;
BYTE* bits = dib + sizeof(bi);
HBITMAP hbitmap = CreateBitmap(bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, bits);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbitmap);
CloseClipboard();
printf("Clipboard set!");
getchar();
}
int main()
{
WSAStartup(MAKEWORD(2, 2), &Winsock); // Start Winsock
if (LOBYTE(Winsock.wVersion) != 2 || HIBYTE(Winsock.wVersion) != 2) // Check version
{
WSACleanup();
return 0;
}
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ZeroMemory(&Addr, sizeof(Addr)); // clear the struct
Addr.sin_family = AF_INET; // set the address family
Addr.sin_addr.s_addr = inet_addr("127.0.0.1");
Addr.sin_port = htons(6000); // set the port
if (connect(Socket, (sockaddr*)&Addr, sizeof(Addr)) < 0)
{
printf("Connection failed !\n");
getchar();
return 0;
}
printf("Connection successful !\n");
printf("Receiving data .. \n");
int dib_size = 0;
char Filesize[10];
if (recv(Socket, Filesize, 10, 0)) // File size
{
dib_size = atoi(Filesize);
}
printf("File size: %d\n", dib_size);
BYTE* dib = new BYTE[dib_size];
if (recv(Socket, (char*)dib, dib_size, 0))
{
receive_function(dib, dib_size);
}
getchar();
return 0;
}
任何和所有的帮助表示赞赏!