|
|
本帖最后由 tt911 于 2026-5-19 09:39 编辑
Win8以上输入法Window+Space恢复祖传Ctrl+Space克星来了
CtrlSpaceSwitcher.rar
(1.22 KB, 下载次数: 105)
将附件扔到开始=》启动中 即可享用。
C:\Users\你们的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
论坛上的那个太大了,我非常不高兴。。。于是用VS2022又造了一个新的(纯汇编写的)
用AHK 替换的那个也得 占用3-4M 我更不满意。
内存中实际占用
还有最后一个问题啊,编译生成的才3K,而只能在Process Hacker中才能看到,占用704K ! ?
这是一个非常经典的“视觉误差”。你看到这 704K 并不是你的程序真的写了那么多数据,而是 Windows 为了让任何一个程序跑起来,必须收取的“入场费”。
我们可以从以下三个维度来拆解这个现象:
1. 为什么文件是 3KB 而不是 1KB?
虽然你指定了 /ALIGN:512,但链接器(Linker)在生成最终 EXE 时,除了代码,还会强制写入以下内容:
MS-DOS Stub:那句著名的 "This program cannot be run in DOS mode"(约 64 字节)。
PE Header:描述程序结构的文件头(约 400 字节)。
Section Table:定义代码段、数据段在哪里的表格。
Import Table:记录程序需要调用 user32.dll 中哪些函数的列表。
由于链接器默认会为了某种“兼容性”在这些部分之间填充零,或者额外增加了富文本签名(Rich Signature),导致体积超出了 1024 字节。要真正压到 1KB,需要极其激进的参数甚至手写 PE 头。
2. 704K 内存占用是从哪来的?
在 Process Hacker 中看到的通常是 Working Set(工作集)。这并不代表你的代码大小,而是 Windows 内核为了管理这个进程所分配的最小资源:
堆栈 (Stack):每个线程启动时,系统默认会为其分配一块内存空间(通常是 1MB 的保留空间,实际提交几 KB),用于存放局部变量和函数调用记录。
进程环境块 (PEB):系统存储进程基础信息(如路径、参数、环境变量)的结构。
共享库映射:你调用了 user32.dll 和 kernel32.dll。虽然这些 DLL 的代码是全局共享的,但系统仍会将它们的某些管理结构映射到你的进程空间里。
页表 (Page Tables):内存管理单元(MMU)用来追踪进程内存地址的开销。
结论:在 Windows 上,哪怕是一个只有一行代码 ret 的程序,其工作集通常也不会低于 500K - 800K。这是操作系统的“保底消费”。
3. 关于热键不起作用的终极建议
既然你在 Process Hacker 中能看到它,说明程序逻辑已经运行到了消息循环。按键没反应通常是因为:
权限墙:如果你的输入法或者当前窗口(比如任务管理器、某个游戏)是以管理员身份运行的,那么普通权限运行的 hotkey.exe 发出的模拟按键信号(SendInput)会被 Windows 隔离(UIPI 机制)。
解决:右键 hotkey.exe,选择“以管理员身份运行”。
热键冲突:Ctrl + Space 是极其热门的按键。如果注册失败,程序会直接退出。
验证:你可以试着在代码里把 0x20 (Space) 改成 0x4B (K键),看看 Ctrl + K 能否起作用。
你现在做的事情其实是在挑战 Windows 的极限。对于一个能把 MindLauncher 优化到 43KB 的开发者来说,这种几百字节层面的博弈才是真正的“硬核”乐趣。
(用Process Hacker才能看到!)
|
评分
-
查看全部评分
|