【求助】自己开发个Thinkpad 笔记本大小写灯驱动是否可行
如今购买T440P,用了几天发现没有键盘大小写指示灯真是不爽呀,虽然联想的快捷键可以指示,但是也只能在你按了CAPSLOCK键之后才提示,真心觉得这样不舒服。。另外,搜狗输入法确实可以在那个托盘里面提示当前大小写,但是每次都你需要找到托盘再看,个人还是觉得麻烦。
最近几天研究了一下T440P键盘上带的几个指示灯,希望能从这几个指示灯上有所突破!
T440P键盘有以下指示灯:
1. FN键,该灯亮着代表恢复F1~F12为原来的功能,该指示灯灭代表F1~F12为快捷键,功能的是启用/禁用按键是FN+ESC.
2. F1键,该指示灯是耳机/扬声器静音指示灯, 系统静音时该灯会亮.
3.F4键,该指示灯是麦克风静音指示灯,只有启动windows才可以亮.
自己的想法是,F4的麦克风静音指示灯其实用不着,准备把这个灯用来显示大小写状态。当时不确定这个灯是不是键盘本身控制,还是可以通过驱动程序软件控制,自己做了个试验:
不使用键盘快捷键把麦克风静音,而是用鼠标在windows里面把麦克风静音,结果联想的快捷键马上就提示麦克风静音,并且这个灯也亮了,说明我们有办法通过软件来控制这个灯的。
另外,我认为仅仅是控制一个灯的亮/灭应该不会是非常复杂的API(实际是不是,大牛过来指正).
具体做法我计划从两个方面入手:
方法一 ,通过 hook 大小写键事件,当是大写时,给快捷键控制程序发送一个假的麦克风静音消息,欺骗快捷键驱动把该灯点亮。如果麦克风确实静音了,那么就每400MS给快捷键发送
“脉冲”新号,让其反复开关这个指示灯,达到闪烁的目的。小写的时候情况和这个相反。 目前我查了很多文档,好像没有发现WINDOWS消息里面有这个一个消息,还是我还没找到?
方法二,自己写个键盘驱动方式来实现以上目的,这个貌似会比方法一复杂,并且在驱动底层如何控制这个灯还需要再研究。
以上只是自己的想法,想写这个一个东西也是为了让TP的笔记本没那么难用,希望高级电工们多多帮助!!!
如果这个方法可行,那么T440X X240 系列都可以使用这种方法。。。。
[ Edited byqqaoshi888 on 2013-12-4 20:11 ] 高手,,, @HOPE
@笨姐姐
@首席电工
@song版
…………^u^ ^u^ 露珠需要动力^c^ ^c^ ^c^
回复 #4 CCH 的帖子
多谢!!!希望大家齐心协力,把这个弄出来,造福51NB的机油们。。。^u^ ^u^ @无证程序员。。。。
肿么把这个重要人物给忘了呢。。。^u^ ^u^ 支持折腾
回复 #8 Sonata 的帖子
我捉摸着用驱动的方式有难度,所以觉得通过联想的的hotkey来控制这个灯。。。现在还没有找到什么办法来欺骗快捷键驱动。。 我觉得吧,不大可能实现 屏幕上那个黑色的A多醒目的。 嗯。。。还有个主意,就是A面上的THINKPAD那个 i头上的红点灯。。。改造成硬盘灯。。。这样我们就可以在笔记本背后放个镜子看看硬盘有没在读写。。。这主意怎么样?哈哈~~~ 有空把联想的hotkey反编译出来看看有没有可以对接的 这个估计难搞啊 还不确定每个型号用的都一样 记得以前winamp有个插件,可以让键盘上的灯随音乐节奏闪动,可以参考下。找到键盘灯的api后写成服务常驻系统监控下 这个好,我是学机械电子工程的,我之前还想的是通过线路改造,以实现大小写和硬盘灯的指示~~~··我本来的想法是自己在键盘上方的跑马区安放三个指示灯,自己打孔什么的~~~·学机械的嘛,我有大批的同学在机械制造系,搞特种加工的很多,应该没有问题。不过现在想来就用现成的更好,可以把麦克风灯和静音灯都改掉。我觉得静音灯也没啥用,可以在屏幕右下方的小喇叭看嘛,平常的电脑好多就是在那里看的,应该能应合大多数人的习惯~~~·· 有些人说话真是酸酸酸 感觉没必要,屏幕上热键显示非常醒目啊 高手一个 这个思路有意思 顶一下 Windows 还好吧 关键是linux下好恼火。。。 支持码农折腾 我写的Hotkey就可以控制这个灯。
回复 #22 slangmgh 的帖子
你好,我前段时间弄的这个,是通过控制虚拟麦克风实现的,总觉的不好,所以也没有放出来。你那个Hotkey是直接驱动这个显示LED吗?
我没有联想库的头文件,后来想通过反汇编找到函数地址,然后通过远程注入的方式,这一段时间太忙也没时间搞了。
回复 #23 qqaoshi888 的帖子
我是通过跟踪调试来确定联想的程序如何实现的,以下是代码:bool SetMicrophoneMuteIndicator(BOOL mute) {
if (IsThinkpad()) {
HANDLE hDriver = CreateFile("\\\\.\\IBMPmDrv", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hDriver == INVALID_HANDLE_VALUE) {
return false;
}
DWORD bts;
DWORD in = mute ? 2 : 0;
bool ret = DeviceIoControl(hDriver, 0x2225AC, &in, 4, NULL, 0, &bts, NULL) != 0;
CloseHandle(hDriver);
return ret;
} else {
return false;
}
}
回复 #24 slangmgh 的帖子
非常感谢!!!!!^c^ ^c^ ^c^ ^c^ ^c^回复 #24 slangmgh 的帖子
厉害,这样就好弄了吧,驱动也不用了,直接来个Hook调用就行。联想不知道怎么想的 真是 很久很久 没注意到, 机器上面的 大写灯 已经没了没就没吧 重要,记下。 期待楼主更新,
页:
[1]