怎样获取别的程序图标句柄

有很多种方法,但是如果只是单一的使用某种方法就可能会出现获取某些软件的图标失败的情况.所以这里介绍两种方法混合使用.

代码如下:

#include <windows.h>

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
    TCHAR szAppName[] = TEXT("MyApp");
    WNDCLASS wndclass = { 0 };
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WinProc;
    wndclass.lpszClassName = szAppName;
    wndclass.lpszMenuName = NULL;
    wndclass.style = CS_VREDRAW | CS_HREDRAW;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("RegisterClass failed\n"),TEXT("Error"),0);
        return 0;
    }

    HWND hwnd = CreateWindow(szAppName, TEXT("MyWindow"), WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, 0);

    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        {
            //待查找窗口的句柄
            HWND findhwnd = NULL;
            //获取的图标句柄
            HICON hIcon = NULL;
            //错误信息
            int err = 0;
            //查找窗口句柄
            findhwnd = FindWindow(L"Notepad", L"测试.txt - 记事本");
            if (!findhwnd)
            {
                err = GetLastError();
            }
            //获取图标句柄
            hIcon = (HICON)SendMessage(findhwnd, WM_GETICON, ICON_SMALL2, 0);
            if (!hIcon)
            {
                //第一种方法获取失败,进行第二种方法获取
                err = GetLastError();
                hIcon = (HICON)GetClassLong(findhwnd, GCL_HICON);
                if (!hIcon)
                {
                    err = GetLastError();
                }

            }
            SetClassLong(hwnd, GCL_HICON, (LONG)hIcon);

        }

        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps = { 0 };
            HDC dc = BeginPaint(hwnd, &ps);

            EndPaint(hwnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

以上一大堆代码,只要关注WM_CREATE里的代码就行了,那就是获取方法.那段代码可以放在回调函数的任何地方执行.

效果如图:
怎样获取别的程序图标句柄_第1张图片

你可能感兴趣的:(windows,callback,winapi,获取图标,HICON)