从hIcon/hBitmap获取字节/字符* 我正在研究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); } //获取窗口图标 HICON HICON=(HICON)(::SendMessageW(hWnd,WM_GETICON,ICON_SMALL,0)); 如果(hIcon==0){ //替代方法。从窗口类获取 hIcon=重新解释cast(::GetClassLongPtrW(hWnd,GCLP_HICONSM)); } //备选方案:从主模块获取第一个图标 如果(hIcon==0){ hIcon=::LoadIcon(GetModuleHandleW(0),MAKEINTRESOURCE(0)); } //替代方法。使用操作系统默认图标 如果(hIcon==0){ hIcon=::加载图标(0,IDI_应用程序); }

从hIcon/hBitmap获取字节/字符* 我正在研究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); } //获取窗口图标 HICON HICON=(HICON)(::SendMessageW(hWnd,WM_GETICON,ICON_SMALL,0)); 如果(hIcon==0){ //替代方法。从窗口类获取 hIcon=重新解释cast(::GetClassLongPtrW(hWnd,GCLP_HICONSM)); } //备选方案:从主模块获取第一个图标 如果(hIcon==0){ hIcon=::LoadIcon(GetModuleHandleW(0),MAKEINTRESOURCE(0)); } //替代方法。使用操作系统默认图标 如果(hIcon==0){ hIcon=::加载图标(0,IDI_应用程序); },c++,windows,winapi,C++,Windows,Winapi,好的,现在我有了图标,我可以用DrawIcon()打印它(只是为了检查) 我的问题是:如何从这里开始获取字节? 我需要一个缓冲区将此数据发送到我的客户端,并将相同的数据转换为列表中的显示图标(图标+进程名称)。所以,我需要得到这个图标/hIcon(或位图/hBitmap等)的字节数 (当然,我需要服务器端的帮助。) 我认为在临时缓冲区中复制图标以获取字节是很好的,但没有任何效果 任何帮助都将不胜感激 编辑: @DavidHeffernan感谢您的回复。我发现这一点:通过StackOverflow

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

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

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

任何帮助都将不胜感激

编辑:

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

我在MSDN和StackOverflow上找到了一些东西,它帮助了我:

#包括“stdafx.h”
#包括
#包括
#pragma注释(lib,“oleaut32.lib”)
HRESULT保存图标(HICON HICON,常量wchar\u t*路径){
//创建IPacture接口
PICTDESC desc={sizeof(PICTDESC)};
desc.picType=picType_图标;
desc.icon.hicon=hicon;
i结构*p图像=0;
HRESULT hr=OleCreatePictureIndirect(&desc,IID_i结构,FALSE,(void**)和pPicture);
如果(失败(hr))返回hr;
//创建一个流并保存图像
IStream*pStream=0;
CreateStreamOnHGlobal(0、TRUE和pStream);
长cbSize=0;
hr=pPicture->SaveAsFile(pStream、TRUE和cbSize);
//将流内容写入文件
如果(!失败(hr)){
HGLOBAL hBuf=0;
GetHGlobalFromStream(pStream和hBuf);
void*buffer=GlobalLock(hBuf);
HANDLE hFile=CreateFile(路径,泛型写,0,0,创建总是,0,0);
如果(!hFile)hr=HRESULT_FROM_WIN32(GetLastError());
否则{
DWORD WRITED=0;
WriteFile(hFile、buffer、cbSize和writed,0);
闭合手柄(hFile);
}
GlobalUnlock(缓冲区);
}
//清理
pStream->Release();
pPicture->Release();
返回人力资源;
}
int _tmain(int argc,_TCHAR*argv[]
{
HICON HICON=(HICON)LoadImage(0,L“c:\\windows\\system32\\perfcentercpl.ico”,图像图标,32,32,LR\u LOADFROMFILE);
如果(!hIcon)返回GetLastError();
HRESULT hr=SaveIcon(hIcon,L“c:\\temp\\test.ico”);
返回人力资源;
}

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

GetIconInfo。不过,您需要学习一些GDI。分配一个缓冲区来接收位图数据是您的责任。请在您的帖子中添加更多信息。如果链接发生变化,你的答案对任何人都没有帮助。
#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;
}