从 hIcon/hBitmap 获取 bytes/char*

Posted

技术标签:

【中文标题】从 hIcon/hBitmap 获取 bytes/char*【英文标题】:Get bytes/char* from hIcon/hBitmap 【发布时间】:2016-07-22 08:59:57 【问题描述】:

我正在开发一个 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()“打印”它(只是为了检查)。

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

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

任何帮助将不胜感激。

编辑:

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

【问题讨论】:

获取图标信息。不过,您将需要学习一些有关 GDI 的知识。 分配一个缓冲区来接收位图数据是你的责任。 【参考方案1】:

我在 MSDN 和 *** 上找到了一些东西,它帮助了我: 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(),我可以保存它,然后在需要时将其作为二进制文件打开并通过套接字发送。

【讨论】:

请在您的帖子中添加更多信息。如果链接发生变化,您的回答对任何人都无济于事。

以上是关于从 hIcon/hBitmap 获取 bytes/char*的主要内容,如果未能解决你的问题,请参考以下文章

无法从 repo.msys2.org : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds 获取文件(

从接口获取 reflect.struct

从 NSData 字节获取浮点值

Swift:如何将Bytes转换为float /获得更精确的数字?

使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%

从jruby访问Java类中的静态字段