今天跟大家唠唠我最近折腾的这个小玩意儿——"switchoff",说白,就是个能一键关屏锁机的工具。
事情是这样的,我那台老笔记本,电源键有点不太灵光,有时候得按好几下才能关屏,烦都烦死。一开始想着凑合用呗,但时间长真受不,就琢磨着能不能搞个软件来代替电源键。
我想到的是找找有没有现成的软件,网上搜一圈,确实有不少类似的工具,但要么广告太多,要么功能太复杂,我就是想简单关个屏而已,不想装一堆乱七八糟的东西。
既然没有合适的,那就自己动手呗!我寻思着,这玩意儿应该不难,就打算自己写一个。
说干就干,我打开我的老伙计Visual Studio,新建一个C#项目(没办法,只会这个)。
第一步,先搞清楚怎么用代码关屏。网上查查,发现可以用`SendMessage`函数来实现。这玩意儿有点底层,但好在网上有很多例子,照着抄就行。
核心代码就是这么几行:
csharp
[DllImport("*")]
public static extern int SendMessage(IntPtr hWnd, int hMsg, int wParam, int lParam);
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
private void SwitchOffScreen()
SendMessage(*, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
这段代码的意思是,向系统发送一个`WM_SYSCOMMAND`消息,告诉它要关闭显示器。`SC_MONITORPOWER`参数指定要控制的电源功能,`2`表示关闭显示器。
搞定关屏,接下来就是锁屏。锁屏更简单,直接用`LockWorkStation`函数就行:
csharp
[DllImport("*")]
public static extern void LockWorkStation();
private void LockScreen()
LockWorkStation();
有关屏和锁屏的功能,接下来就是把它们整合起来。我想做成一个简单的界面,就一个按钮,点就关屏锁屏。
我拖一个`Button`控件到窗体上,然后双击按钮,生成`Click`事件的处理函数。在这个函数里,先调用`SwitchOffScreen`函数关屏,然后调用`LockScreen`函数锁屏:
csharp
private void button1_Click(object sender, EventArgs e)
SwitchOffScreen();
LockScreen();
代码写完,编译一下,运行!
第一次运行,直接报错。仔细一看,原来是权限问题。`SendMessage`函数需要管理员权限才能调用。
解决办法也很简单,修改一下程序的manifest文件,让它以管理员权限运行。
再次编译运行,这回终于成功!点击按钮,屏幕瞬间黑,然后自动锁屏,完美!
但是,还有一个问题,每次都要打开程序才能关屏,太麻烦。我想把它放到任务栏托盘里,这样就可以随时点击图标来关屏。
实现这个功能也很简单,添加一个`NotifyIcon`控件到窗体上,设置它的`Icon`属性为一个合适的图标。然后,在窗体的`Load`事件中,把窗体隐藏起来,只显示托盘图标:
csharp
private void Form1_Load(object sender, EventArgs e)
* = false;
* = false;
* = true;
为托盘图标添加一个`Click`事件,当点击图标时,调用`SwitchOffScreen`和`LockScreen`函数:
csharp
private void notifyIcon1_Click(object sender, EventArgs e)
SwitchOffScreen();
LockScreen();
为方便退出程序,我给托盘图标添加一个右键菜单,菜单里有一个“退出”选项。点击“退出”选项时,关闭程序:
csharp
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
搞定托盘图标,再次编译运行,这回就更完美!程序启动后,自动隐藏到任务栏托盘里,点击图标,就可以一键关屏锁屏。
整个过程下来,虽然代码很简单,但也学到一些东西,比如怎么使用`SendMessage`函数,怎么操作任务栏托盘等等。最重要的是,解决一个实际问题,让我的老笔记本焕发第二春。
这个小工具还有很多可以改进的地方,比如可以添加自定义快捷键,可以设置自动关屏时间等等。以后有时间再慢慢折腾。
这回的实践经历让我觉得,只要肯动手,很多问题都可以自己解决。而且在解决问题的过程中,也能学到很多新的知识。这就是DIY的乐趣所在!