gpt4 book ai didi

c++ - 从 hIcon/hBitmap 获取 bytes/char*

转载 作者:可可西里 更新时间:2023-11-01 11:25:40 26 4
gpt4 key购买 nike

我正在开发一个 C/S 应用程序,C++ 中的服务器和 C# 中的客户端,我需要发送一些有关当前正在运行的进程和相关图标的信息。感谢 EnumWindows 我得到了图标文件,回调中有这段代码...

// Get the window icon
HICON hIcon = (HICON)(::SendMessageW(hWnd, WM_GETICON, ICON_SMALL, 0));
if (hIcon == 0) {
// Alternative method. Get from the window class
hIcon = reinterpret_cast<HICON>(::GetClassLongPtrW(hWnd, GCLP_HICONSM));
}
// Alternative: get the first icon from the main module
if (hIcon == 0) {
hIcon = ::LoadIcon(GetModuleHandleW(0), MAKEINTRESOURCE(0));
}
// Alternative method. Use OS default icon
if (hIcon == 0) {
hIcon = ::LoadIcon(0, IDI_APPLICATION);
}

好的,现在我有了图标,我可以用DrawIcon()“打印”它(只是为了检查)。

我的问题是:如何从这里开始获取字节?我需要一个缓冲区来将此数据发送到我的客户端并转换相同的数据以在列表中显示图标(图标 + process_name)。因此,我需要获取此图标/hIcon(或位图/hBitmap 等)的字节(当然我需要服务器端的帮助。)

我认为将图标复制到临时缓冲区中以获取字节是很好的做法,但没有任何效果。

如有任何帮助,我们将不胜感激。

编辑:

@DavidHeffernan 谢谢你的回复。我发现了这个:Converting-DDB-to-DIB通过 StackOverflow 过去的问题(抱歉,如果发布外部链接不好)。现在,使用 GetDIBits() 我在第五个参数中有 LPVOID lpvBits ,即“指向接收位图数据的缓冲区的指针 msdn - GetDIBits() ”现在,我应该如何从 lpvBits 发送?什么是位图大小?

最佳答案

我在 MSDN 和 StackOverflow 上找到了一些东西对我有帮助: link ;

#include "stdafx.h"
#include <windows.h>
#include <olectl.h>
#pragma comment(lib, "oleaut32.lib")

HRESULT SaveIcon(HICON hIcon, const wchar_t* path) {
// Create the IPicture intrface
PICTDESC desc = { sizeof(PICTDESC) };
desc.picType = PICTYPE_ICON;
desc.icon.hicon = hIcon;
IPicture* pPicture = 0;
HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture);
if (FAILED(hr)) return hr;

// Create a stream and save the image
IStream* pStream = 0;
CreateStreamOnHGlobal(0, TRUE, &pStream);
LONG cbSize = 0;
hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize);

// Write the stream content to the file
if (!FAILED(hr)) {
HGLOBAL hBuf = 0;
GetHGlobalFromStream(pStream, &hBuf);
void* buffer = GlobalLock(hBuf);
HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if (!hFile) hr = HRESULT_FROM_WIN32(GetLastError());
else {
DWORD written = 0;
WriteFile(hFile, buffer, cbSize, &written, 0);
CloseHandle(hFile);
}
GlobalUnlock(buffer);
}
// Cleanup
pStream->Release();
pPicture->Release();
return hr;

}
int _tmain(int argc, _TCHAR* argv[])
{
HICON hIcon = (HICON)LoadImage(0, L"c:\\windows\\system32\\perfcentercpl.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
if (!hIcon) return GetLastError();
HRESULT hr = SaveIcon(hIcon, L"c:\\temp\\test.ico");
return hr;
}

感谢 SaveIcon() 我可以保存它,然后在需要时,我可以将它作为二进制文件打开并通过套接字发送。

关于c++ - 从 hIcon/hBitmap 获取 bytes/char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38522328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com