当前位置: 首页 > news >正文

hotkey resizer, rect win small app using C, tool utils

my rectwin app enhanced:

 

#include <windows.h>
#include <shellapi.h> // For Shell_NotifyIcon functions
#include <stdio.h>// building the app:
// gcc h1.c -o h1.exe -luser32 -lcomctl32 -mwindows#define ID_TRAY_APP_ICON 1001
#define WM_TRAYICON (WM_USER + 1)// Hotkey IDs
#define HOTKEY_QUARTER_U 1
#define HOTKEY_QUARTER_I 2
#define HOTKEY_QUARTER_J 3
#define HOTKEY_K 4
#define HOTKEY_HALF_LEFT 5
#define HOTKEY_HALF_RIGHT 6
#define HOTKEY_HALF_UP 7
#define HOTKEY_HALF_DOWN 8
#define HOTKEY_FULL_SCREEN 9 // <-- New hotkey for full screenHICON hIcon;
NOTIFYICONDATA nid;// Function prototypes
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void RegisterHotkeys(HWND hwnd);
void UnregisterHotkeys(HWND hwnd);
void ShowContextMenu(HWND hwnd, POINT pt);
void SetupTrayIcon(HWND hwnd);
void RemoveTrayIcon(HWND hwnd);
void ResizeActiveWindow(double rel_x, double rel_y, double rel_w, double rel_h);
void InitTrayIcon(HWND hwnd);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR, int nCmdShow)
{// Register window classWNDCLASS wc = {0};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = "HotkeyResizerTray";if (!RegisterClass(&wc)){MessageBox(NULL, "Failed to register window class", "Error", MB_OK);return 1;}// Create invisible windowHWND hwnd = CreateWindow(wc.lpszClassName, "Hotkey Resizer Tray", 0,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);if (!hwnd){MessageBox(NULL, "Failed to create window", "Error", MB_OK);return 1;}// Load an icon for the trayhIcon = LoadIcon(NULL, IDI_APPLICATION);// Setup system tray icon
    SetupTrayIcon(hwnd);// Register hotkeys
    RegisterHotkeys(hwnd);// Message loop
    MSG msg;while (GetMessage(&msg, NULL, 0, 0) > 0){TranslateMessage(&msg);DispatchMessage(&msg);}// Cleanup
    UnregisterHotkeys(hwnd);RemoveTrayIcon(hwnd);DestroyIcon(hIcon);return 0;
}// Register hotkeys
void RegisterHotkeys(HWND hwnd)
{RegisterHotKey(hwnd, HOTKEY_QUARTER_U, MOD_CONTROL, 0x55); // Ctrl+URegisterHotKey(hwnd, HOTKEY_QUARTER_I, MOD_CONTROL, 0x49); // Ctrl+IRegisterHotKey(hwnd, HOTKEY_QUARTER_J, MOD_CONTROL, 0x4A); // Ctrl+JRegisterHotKey(hwnd, HOTKEY_K, MOD_CONTROL, 0x4B);         // Ctrl+K
RegisterHotKey(hwnd, HOTKEY_HALF_LEFT, MOD_CONTROL, VK_LEFT);RegisterHotKey(hwnd, HOTKEY_HALF_RIGHT, MOD_CONTROL, VK_RIGHT);RegisterHotKey(hwnd, HOTKEY_HALF_UP, MOD_CONTROL, VK_UP);RegisterHotKey(hwnd, HOTKEY_HALF_DOWN, MOD_CONTROL, VK_DOWN);// Add Ctrl+Enter for full screen resize
    RegisterHotKey(hwnd, HOTKEY_FULL_SCREEN, MOD_CONTROL, VK_RETURN);
}// Unregister hotkeys
void UnregisterHotkeys(HWND hwnd)
{for (int id = HOTKEY_QUARTER_U; id <= HOTKEY_FULL_SCREEN; id++){UnregisterHotKey(hwnd, id);}
}// Setup system tray icon
void SetupTrayIcon(HWND hwnd)
{memset(&nid, 0, sizeof(nid));nid.cbSize = sizeof(nid);nid.hWnd = hwnd;nid.uID = ID_TRAY_APP_ICON;nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;nid.uCallbackMessage = WM_TRAYICON;nid.hIcon = hIcon;strcpy(nid.szTip, "Hotkey Resizer (Right-click for options)");Shell_NotifyIcon(NIM_ADD, &nid);
}// Remove tray icon
void RemoveTrayIcon(HWND hwnd)
{Shell_NotifyIcon(NIM_DELETE, &nid);
}// Show context menu
void ShowContextMenu(HWND hwnd, POINT pt)
{HMENU hMenu = CreatePopupMenu();if (hMenu){InsertMenu(hMenu, -1, MF_BYPOSITION, 1, "Exit");SetForegroundWindow(hwnd);TrackPopupMenu(hMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, pt.x, pt.y, 0, hwnd, NULL);DestroyMenu(hMenu);}
}// Resize window based on relative position and size
void ResizeActiveWindow(double rel_x, double rel_y, double rel_w, double rel_h)
{HWND hwndActive = GetForegroundWindow();if (!hwndActive)return;RECT workArea;SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);int screenWidth = workArea.right - workArea.left;int screenHeight = workArea.bottom - workArea.top;int newX = workArea.left + (int)(rel_x * screenWidth);int newY = workArea.top + (int)(rel_y * screenHeight);int newW = (int)(rel_w * screenWidth);int newH = (int)(rel_h * screenHeight);SetWindowPos(hwndActive, HWND_TOP, newX, newY, newW, newH, SWP_NOZORDER);
}// Resize to full screen
void ResizeToFullScreen()
{HWND hwndActive = GetForegroundWindow();if (!hwndActive)return;RECT workArea;SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);int width = workArea.right - workArea.left;int height = workArea.bottom - workArea.top;SetWindowPos(hwndActive, HWND_TOP, workArea.left, workArea.top, width, height, SWP_NOZORDER);
}// Main window procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_TRAYICON:if (lParam == WM_RBUTTONDOWN){POINT pt;GetCursorPos(&pt);ShowContextMenu(hwnd, pt);}break;case WM_COMMAND:if (LOWORD(wParam) == 1){ // Exit menu itemPostQuitMessage(0);}break;case WM_HOTKEY:switch (wParam){case HOTKEY_QUARTER_U:ResizeActiveWindow(0, 0, 0.5, 0.5);break;case HOTKEY_QUARTER_I:ResizeActiveWindow(0.5, 0, 0.5, 0.5);break;case HOTKEY_QUARTER_J:ResizeActiveWindow(0, 0.5, 0.5, 0.5);break;case HOTKEY_K:ResizeActiveWindow(0.5, 0.5, 0.5, 0.5);break;case HOTKEY_HALF_LEFT:ResizeActiveWindow(0, 0, 0.5, 1);break;case HOTKEY_HALF_RIGHT:ResizeActiveWindow(0.5, 0, 0.5, 1);break;case HOTKEY_HALF_UP:ResizeActiveWindow(0, 0, 1, 0.5);break;case HOTKEY_HALF_DOWN:ResizeActiveWindow(0, 0.5, 1, 0.5);break;case HOTKEY_FULL_SCREEN:ResizeToFullScreen();break;}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}
View Code

 

http://www.jsqmd.com/news/586431/

相关文章:

  • 5个LDO选型避坑指南:从手机到汽车电子的实战经验分享
  • 终极指南:3分钟搞定LTspice仿真数据导入MATLAB的高效方法
  • 3大突破让实时翻译不再阻碍跨语言体验
  • 明日方舟游戏资源库完整技术指南:专业级素材与数据解析实战
  • 2026口碑电动车充电柜服务商,满足你的需求,扫码付费洗衣机/共享充电桩管理系统/跨境定制换电柜,充电柜方案商选哪家 - 品牌推荐师
  • Sonic数字人视频惊艳效果展示:看静态照片如何“开口说话”
  • 快速验证运维思路:用快马AI一键生成服务器监控脚本原型
  • Oracle19c磁盘告急?adrci一键清理日志文件实战(附集群/单机差异)
  • 不止于install:实战讲解如何用快马AI配置带缓存与检查的CI/CD npm流程
  • 2026年西安贴隐形车衣不会起泡的店探寻,能抗紫外线还不坑人 - mypinpai
  • 无人机航拍实时拼接实战:用Map2DFusion搞定大场景正射影像(附避坑指南)
  • 效率翻倍:用快马一键生成博客系统核心模块,专注业务创新
  • 号易客服联系方式官方指南:电话17852539584、微信haoyi30与全渠道支持 - 号易-号易官网招商
  • 颠覆式开源工具OpCore-Simplify:自动化配置提升Hackintosh效率的完整指南
  • 效率飞跃:用快马AI一键生成云原生监控系统代码骨架
  • Ostrakon-VL-8B基础教程:app.py核心逻辑解析+Gradio接口扩展方法
  • Obsidian插件汉化终极指南:3种翻译模式彻底告别英文界面困扰
  • 在OpenWRT上通过LuCI界面轻松管理Docker容器:告别命令行的3个步骤
  • 从期末实战到技术精进:计算机核心课程通关策略与前沿应用展望
  • 4个步骤掌握系统字体定制:No!! MeiryoUI的无限制个性化解决方案
  • B站资源永久保存解决方案:跨平台视频下载与管理工具全指南
  • 终极实战:Adafruit_SH1106驱动OLED屏幕的高效图形库深度解析
  • 新手入门指南:通过快马生成heic转jpg项目学习前端文件处理
  • seo收录查询工具如何快速提升网站收录
  • 用Python+Matplotlib搞定地铁客流分析:从Excel数据到散点图、柱状图实战
  • 深入解析STM32F103 Flash扇区重复擦除失败及FLASH_ERROR_PG错误的解决方案
  • 从单周期到多周期:深入对比MIPS CPU设计,看微程序控制器如何成为‘大脑’
  • tao-8k Embedding模型惊艳案例:工业设备维修手册语义检索实战
  • 免费音频转换器fre:ac:3步掌握跨平台音频格式转换完整指南
  • 多边形等距缩放算法:从原理到OpenCV实现