因為新買的 Win10 筆電在睡眠恢復後,NumLock 會被關掉,所以寫了這個程式。
-------------------------------------------------
NumLock Resume Fix 下載 https://drive.google.com/open?id=0B-FwFpetKuXjTjBRSWJsSndtUWM
GitHub Link https://github.com/sbeat313/Winform/tree/master/NumLock
-------------------------------------------------
主要的設計方向
A - 1.判斷電腦從睡眠模式恢復。
A - 2.開啟 NumLock。
次要的設計方向
B - 1.開機啟動。
B - 2.程式常駐。
-------------------------------------------------
A - 1 判斷電腦從睡眠模式恢復。
使用的是 PowerModeChangedEventHandler (MSDN)
使用後會回傳三種模式,而我們選擇 " Resume " 來使用。
| 成員名稱 | 描述 |
|---|---|
| Resume |
作業系統即將從暫停狀態恢復。 |
| StatusChange |
由作業系統引發電源模式狀態通知事件。 這可能表示弱式或電池充電中、 AC 電源與電池或另一個系統的狀態變更之間轉換的電源供應器。 |
| Suspend |
作業系統即將暫停。 |
-------------------------------------------------
A - 2.開啟 NumLock。
開啟 NumLock則是調用 Win32.dll的 keybd_event function(MSDN) 方式達成
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_KEYUP, 0);
-------------------------------------------------
P.s 若需要判斷 NumLock 目前狀態可使用 IsKeyLocked(MSDN)。
寫成如下:
if (!Control.IsKeyLocked(Keys.NumLock) == true)
{
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_KEYUP, 0);
}
-------------------------------------------------
B - 1 開機啟動
透過在註冊表添加機碼的方式達成,使用 RegistryKey (MSDN)。
| 對此台電腦所有帳戶生效 | "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" |
| 對目前帳戶生效 | "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" |
我通常需要記錄少筆的程式設定值會使用 Registry 來儲存,多筆則寫成 *.ini 檔。
| 寫入值的方法 | Registry.SetValue(String , Object , RegistryValueKind)。 |
| 讀取值的方法 | Registry.GetValue(String , Object )。 |
-------------------------------------------------
B - 2 程式常駐
常駐:
1.程式收到右下角成為一個小圖示。
- 使用工具箱的 NotifyIcon 可以達成,可以設定顯示的 Text 通常為程式名。
- 可以搭配工具箱的 ContextMenuStrip 使用,以達成小圖示右鍵功能表。
2.程式 " 不會 " 在工作列 Taskbar 出現。
- this.ShowInTaskbar = false;
正常:
1.程式恢復到一般尺寸。
- this.WindowState = FormWindowState.Minimized;
2.程式 " 會 " 在工作列 Taskbar 出現。
- this.ShowInTaskbar = true;
-------------------------------------------------
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace NumLock
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
public Form1()
{
InitializeComponent();
Registry.SetValue(@"HKEY_Current_User\Control Panel\Keyboard", "InitialKeyboardIndicators", "2");
if (!Control.IsKeyLocked(Keys.NumLock) == true)
{
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_KEYUP, 0);
}
}
RegistryKey regitsryKeyStartUp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
#region 主程式
#region 視窗載入
private void Form1_Load(object sender, EventArgs e)
{
isFormHide();
var isStartUp = (regitsryKeyStartUp.GetValue("NumLock Resume Fix") == null) ? chkBoxStartUp.Checked = false : chkBoxStartUp.Checked = true;
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEventsPowerModeChanged);
}
#endregion
#region 判斷從睡眠模式回復並按下NumLock
private void SystemEventsPowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
if (e.Mode.ToString() == "Resume")
{
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)Keys.NumLock, 0, KEYEVENTF_KEYUP, 0);
}
}
#endregion
#endregion
#region 人性化功能
#region 判斷是否隱藏視窗
private void isFormHide()
{
string registryPath = @"HKEY_CURRENT_USER\SOFTWARE\ChongHou";
if (Registry.GetValue(registryPath, "Hide", "false") == null)
{
Registry.SetValue(registryPath, "Hide", "false");
}
else if (Registry.GetValue(registryPath, "Hide", "false").ToString() == "True")
{
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
chkBoxHideMode.Checked = true;
}
}
#endregion
#region 設定是否開啟常駐模式
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
bool formHide;
var checkFormHide = (chkBoxHideMode.Checked == true) ? formHide = true : formHide = false;
Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\ChongHou", "Hide", formHide);
}
#endregion
#region 解除常駐模式恢復正常視窗
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = true;
}
#endregion
#region 設定是否開機啟動
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if(chkBoxStartUp.Checked == true)
{
regitsryKeyStartUp.SetValue("NumLock Resume Fix", Application.ExecutablePath);
}
else
{
regitsryKeyStartUp.DeleteValue("NumLock Resume Fix", false);
}
}
#endregion
#endregion
}
}
本頁面為一點點累積學習寫程式之路。
許多資訊不是正確、或只是自己看的懂得。
如果不小心點進來誤導了您,還真的不好意思。