第一次接觸所謂的護(hù)眼模式,,還是在做安卓腳本的時(shí)候看到別人再聊這個(gè)東西,后面一研究發(fā)現(xiàn),其實(shí)就是在屏幕上做一個(gè)半透明的,、可穿透點(diǎn)擊的懸浮窗,正好因?yàn)樽罱鼘懥藘善P(guān)于窗體,、控件的透明實(shí)現(xiàn),,所以也用Winform窗體來簡(jiǎn)單實(shí)現(xiàn)一下。 開發(fā)環(huán)境:.NET Framework版本:4.8 開發(fā)工具:Visual Studio 2022 - 本功能主要使用到了兩個(gè)Win Api函數(shù):
SetWindowLong 和GetWindowLong ,,用來實(shí)現(xiàn)穿透點(diǎn)擊
private const uint WS_EX_LAYERED = 0x80000; private const int WS_EX_TRANSPARENT = 0x20; private const int GWL_EXSTYLE = (-20);
[DllImport("user32", EntryPoint = "SetWindowLong")] private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
[DllImport("user32", EntryPoint = "GetWindowLong")] private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
- 然后在
Form1_Load 事件中做以下處理,,設(shè)置背景色以及透明度(既然說是護(hù)眼,那肯定得綠色了),。然后這里如果不考慮任務(wù)欄的話,,可以直接采用窗體最大化,考慮任務(wù)欄或者多屏的情況下,,就設(shè)置窗體的Size屬性,。
private void Form1_Load(object sender, EventArgs e) { FormBorderStyle = FormBorderStyle.None; // WindowState = FormWindowState.Maximized; Location = new Point(0, 0); Size = Screen.PrimaryScreen.Bounds.Size;
BackColor = Color.Green; Opacity = 0.3;
ShowInTaskbar = false; TopMost = true;
GetWindowLong(this.Handle, GWL_EXSTYLE); SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);
} 最后,關(guān)于Windows Api函數(shù)的官方說明文檔我也上傳了一份,,可以點(diǎn)擊文末的小程序下載
|