应该也可以自己做个 dll 按钮,做自己的工具就很方便了
示例代码:
#include <windows.h>
#define BUTTON_SIZE 40
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// `shell32.dll` 中图标的索引
int iconIndexes[16] = {4, 5, 7, 10, 14, 16, 18, 21,
23, 27, 31, 35, 39, 43, 45, 60};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
// 注册窗口类
const char CLASS_NAME[] = "SimpleWindowClass";
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
// 窗口宽度和高度
int w = 320;
int h = 80;
// 计算窗口显示位置
int x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2;
int y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;
// 创建窗口
HWND hwnd =
CreateWindowEx(WS_EX_TOPMOST, CLASS_NAME, "", WS_POPUP | WS_VISIBLE, x, y,
w, h, NULL, NULL, hInstance, NULL);
if (!hwnd) {
return 0;
}
// 显示窗口
ShowWindow(hwnd, nCmdShow);
// 进入消息循环
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam) {
switch (uMsg) {
case WM_CREATE: {
// 获取 shell32.dll 的路径
char shell32Path[MAX_PATH];
GetSystemDirectory(shell32Path, MAX_PATH);
strcat(shell32Path, "\\shell32.dll");
// 创建16个按钮并加载不同图标
for (int i = 0; i < 16; ++i) {
int x = (i % 8) * BUTTON_SIZE;
int y = (i / 8) * BUTTON_SIZE;
HWND hButton = CreateWindow(
"BUTTON", "", WS_CHILD | WS_VISIBLE | BS_ICON, x, y, BUTTON_SIZE,
BUTTON_SIZE, hwnd, (HMENU)(1000 + i), GetModuleHandle(NULL), NULL);
// 使用 ExtractIcon 从 shell32.dll 中提取图标
HICON hIcon =
ExtractIcon(GetModuleHandle(NULL), shell32Path, iconIndexes[i]);
SendMessage(hButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);
}
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}