从hIcon / hBitmap获取bytes / char *

时间:2016-07-22 08:59:58

标签: c++ windows winapi

我正在使用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);
}

好的,现在我有了Icon,我可以&#34;打印&#34;它(仅用于检查)与DrawIcon()

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

我认为在临时缓冲区中复制图标以获取字节是好的,但没有任何作用。

任何帮助都将不胜感激。

修改

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

1 个答案:

答案 0 :(得分:3)

我在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()我可以保存它,之后,在需要时,我可以将其打开为二进制文件并通过套接字发送。