2026-06-09

[powershell] 用Gemini自製scrnsave.scr

繼上篇  [cmd]利用保護螢幕裝置關螢幕不關喇叭(關螢幕聽歌)
已知 .scr 是透過 C# 編寫而成
現今已經是 AI 撰寫程式的時代,就算我們不懂 C#,也沒有 VSCode,一樣也可以自己做螢幕保護程式
畢竟有個現成的在那邊可以抄,所以我們只要對AI下達想要的指令
用什麼程式語言撰寫、希望的功能是什麼,最主要的這兩個方向訂下後,步步邁向目標

一開始,我希望他用powershell實現,雖然可以成功,但只成功一半,他會卡死在迴圈之中
透過第一個方式,我們知道保護螢幕裝置,實際上就是開啟一個全螢幕的程式把畫面擋住,並將鼠標消除,透過迴圈偵測滑鼠是否移動,來退出迴圈。

大方向對了,那我們就繼續

卡死迴圈的bug一直無法解決,於是他又推薦我改用edge實現
雖然畫面黑了,卻一直無法正確全螢幕,他用的全螢幕方案太複雜,我就叫他換另一個方案
他認為是針對edge視窗控制比較困難,所以想換成IE來控制
但我說 NO!,IE很多漏洞我可不想

於是乎轉了一圈,還是回歸C#
我才知道不用VSCode,微軟本身就有C#的編譯器(我不知道哪來的)
直接透過powershell編譯一個exe,改個附檔名變成scr就成了
這次BUG就問題不大,慢慢和AI一來一回修改就搞定了

經過多次修改,就成下面的程式碼

Add-Type -AssemblyName System.Windows.Forms

# 1. 定義 C# 原始碼(完美雙螢幕、純黑、防震動退出、隱藏游標)
$csharpCode = @"
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;

namespace PureBlackScreenSaver
{
    public class BlackForm : Form
    {
        private Point mouseLocation = Point.Empty;

        public BlackForm(Screen targetScreen)
        {
            this.BackColor = Color.Black;
            this.FormBorderStyle = FormBorderStyle.None;
            this.StartPosition = FormStartPosition.Manual;
            this.TopMost = true;
            this.Bounds = targetScreen.Bounds;
            this.DoubleBuffered = true;
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Cursor.Hide(); 
        }

        private void ExitAction()
        {
            Cursor.Show();
            Application.Exit();
        }

        protected override void OnKeyDown(KeyEventArgs e) { ExitAction(); }
        protected override void OnMouseDown(MouseEventArgs e) { ExitAction(); }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (mouseLocation.IsEmpty)
            {
                mouseLocation = e.Location;
                return;
            }

            if (Math.Abs(e.X - mouseLocation.X) > 15 || Math.Abs(e.Y - mouseLocation.Y) > 15)
            {
                ExitAction();
            }
        }
    }


    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            string rawCommandLine = Environment.CommandLine.ToLower();

            // ─── 情況一:完全沒有參數 (args.Length == 0) ───
            // 根據你的測試,只有在 Win11 右鍵點擊「設定」時,才會是空參數
            if (args.Length == 0)
            {
                MessageBox.Show("這個純黑螢幕保護程式不需要任何設定功能喔!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return; // 精準攔截 Win11 右鍵設定,直接結束
            }

            // ─── 情況二:有帶參數 ───
            if (args.Length > 0)
            {
                // 1. 傳統螢幕保護程式面板點擊「設定」(/c)
                if (rawCommandLine.Contains("/c"))
                {
                    MessageBox.Show("這個純黑螢幕保護程式不需要任何設定功能喔!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return; // 精準攔截傳統面板設定,直接結束
                }
    
                // 2. 傳統螢幕保護程式面板的小螢幕預覽(/p)
                if (rawCommandLine.Contains("/p"))
                {
                    return; // 直接結束,防止背景亂跑
                }

                // 3. 剩下的狀況(包含 /s 或 /S):不論是雙擊開啟、右鍵 Test、還是系統閒置,通通放行塗黑!
            }
    
            // ─── 真正執行全螢幕純黑的邏輯 ───
            foreach (Screen screen in Screen.AllScreens)
            {
                BlackForm form = new BlackForm(screen);
                form.Show();
            }
            Application.Run();
        }
    }
}
"@

# 💡【核心修正】將輸出路徑強制設定在當前使用者的「桌面」,避開 System32 權限問題
$desktopPath = [Environment]::GetFolderPath("Desktop")
$sourceFile = Join-Path $desktopPath "BlackScreen.cs"
$outputFile = Join-Path $desktopPath "PureBlackSaver.exe"
$scrFile = Join-Path $desktopPath "PureBlackSaver.scr"

Set-Content -Path $sourceFile -Value $csharpCode -Encoding UTF8

# 2. 自動尋找 Windows 內建的 .NET C# 編譯器 (csc.exe)
$cscPath = Join-Path $env:windir "Microsoft.NET\Framework64\v4.0.30319\csc.exe"
if (-not (Test-Path $cscPath)) {
    $cscPath = Join-Path $env:windir "Microsoft.NET\Framework\v4.0.30319\csc.exe"
}

if (Test-Path $cscPath) {
    Write-Host "正在透過 Windows 內建編譯器打包成 C# 原生程式..." -ForegroundColor Green
    
    # 呼叫編譯器
    & $cscPath /target:winexe /out:$outputFile $sourceFile
    
    if (Test-Path $outputFile) {
      
        # 自動複製一份並改名為 .scr 螢幕保護程式格式
        Copy-Item $outputFile $scrFile
        Write-Host "【成功】已在 $scrFile 產生" -ForegroundColor Cyan
        
        # 刪除過渡期的臨時 .cs 原始碼檔案
        Remove-Item $sourceFile
        Remove-Item $outputFile
    } else {
        Write-Error "編譯失敗,請檢查代碼。"
    }
} else {
    Write-Error "找不到 Windows 內建的 .NET 編譯器環境!"
}

2025-09-23

[IOS][快速交通卡][移動西瓜卡] モバイルSuica 購買周遊券教學。202510更新

 

 

吉依卡哇卡面                  優惠車票
↑我的西瓜卡(吉依卡哇卡面)
選擇右下角 Suica管理
                 ↑選擇 おトクなきっぷ(優惠車票)
                                                  
                
↑選擇 新規購入                   ↑選擇你想要的周遊券       

                                 
                
↑選擇右上角 次へ 繼續
想要了解車票可以點擊下方
商品ページ查看詳情
                 ↑確認選擇的車票無誤後
就可以點下方🍎 Pay付款 

                                 

2024-12-12

[powershell] 公司電腦 防止系統進入鎖定(睡眠狀態或關閉顯示器)(windwos10使用)

一般來說,公司電腦為了防止資安風險,人離開座位就應該要將電腦鎖定避免他人使用,IT常常會做一個防呆措施,就是當電腦未活動超過5分鐘,就會自動進入鎖定狀態。而我們並非離開座位,只是未觸碰電腦使其進入工作狀態,一言不合就將電腦鎖定,一直打密碼登入十分麻煩。

IT避免使用者調整鎖定時間,一般會用安全性原則和限制使用者權限去防止使用者修改。 windows 裡面會偵測影片撥放、投影片播放等功能,來判斷使用者正在使用電腦,進而禁止休眠狀態啟用。 

影片播放、放映投影片通常是當前視窗執行,不可能一直掛著影片防止系統鎖定,老闆看到會生氣,整天看YT當個薪水小偷實在是不太恰當!

於是大神們用 C++ 去呼叫 SetThreadExecutionStat,讓更新狀態成"系統正在使用中",進而防止系統在應用程式執行時進入睡眠狀態或關閉顯示器。

2024-09-25

[vtub][Hololive] 你是否記得九月二十一號晚上? 【UNARCHIVED KARAOKE】get in the shoebox

September,這首經典歌曲,就算不知道也很高機率聽到他的曲調,不時被影視作品、電子遊戲作為插曲或是配樂。



Gigi_Murin (簡稱Gigi)
Gigi_Murin (簡稱Gigi)

如今,不管你記得記得,今年九月二十一日,Gigi 讓你用八個小時永生難忘。

2024-05-12

沖繩バス周遊券、OTOPA使用心得

來到沖繩,交通方式不外乎是自駕、巴士,或搭計程車

其中最省錢也最花時間的方式就是搭乘巴士暢遊沖繩了

沖繩的巴士目前是不支援島外交通ic卡,所以什麼suica或是icoca都別想了

想使用交通ic搭乘巴士只能使用沖繩縣內發行的okica

身為外國人,就可以購買周遊券來節省我們的荷包

2024-01-28

[日本][京成電鐵] 2024出國筆記 成田機場->東京

  1. 機場免費停車、接送應選擇的信用卡:
    https://www.cardu.com.tw/card/card_browse.php?pref=pref201811061807139

  2. 成田機場->上野 京成電鐵搭乘表:

    京成電鐵(KS)(本線)(藍線)(特急費不用)(1050両)(2022年10月1日改定);
    成田機場第二航廈藍色月台搭乘
    可乘坐:
    快特=快速特急   特急   通特=通勤特急   快速   普通

    京成電鐵(Access Express)(特急費不用)(在來線)(橘線)(1270両)(2022年10月1日改定);
    成田機場第二航廈橘色月台搭乘
    可乘坐:
    ア特=アクセス特急 (Access Express) 

    京成電鐵(Skyliner)(全席指定)(在來線)(橘線)(1270両)+(特急料金1300両);
    成田機場第二航廈橘色月台搭乘
    可乘坐:
    ス=スカイライナー (Skyliner)

    京成電鐵(Morning Liner)(Evening Liner)(本線)(藍線)(1050両)+(特急料金450両);
    成田機場第二航廈藍色月台搭乘
    可乘坐:
    モ=モーニングライナー (Morning Liner)  
    早晨線部分班次需至京成成田搭乘
    夜間線為京成上野=》京成成田(或成田機場)班次
    イ=イブニングライナー (Evening Liner)

    JR 成田機場 ⇔ 東京站 1,170
    JR-成田特快「N'EX
    普通車廂 3,070日圓 綠色車廂 5,340日圓 (已內含一般料金及特急料金)
    成田機場 ⇔ 東京站 來回一趟 5,000日圓 (有效期間14天內)


    ;巴士

2023-12-11

[筆記] [cmd] 刪除印表機卡佇列

有時候印表機列印文件無法刪除,可以嘗試停用列印多工緩衝處理器服務

並把%WINDIR%\system32\spool\printers內的文件刪除

再把列印多工緩衝處理器服務啟動

2023-11-12

[筆記] LOL_REPLAY.bat (20241210更新)

請將下列程式碼複製後另存為成.bat,編檔方式請選擇ANSI

[筆記] [cmd] 搜尋功能 -- Find 如何搜尋檔案內文字不要顯示檔案名稱

在使用 Find 的搜尋檔案內文字時候

最後答案通常會是

給你一個長長的尾巴,再給告訴你剛剛輸入的檔名、以及答案

>find /i "locale:" LeagueClientSettings.yaml
---------- LEAGUECLIENTSETTINGS.YAML
        locale: "zh_TW"

通常會退而求其次,使用 Findstr

>findstr "locale:" "LeagueClientSettings.yaml"
        locale: "zh_TW"



2023-09-08

[機翻][歌詞翻譯][hololive]Pineapple

 

 
專輯連結:https://cover.lnk.to/PointofView

作曲:LIGHTS、Johnny R、monies
編曲:KIRA、Johnny R、moni
歌詞:monii, Johnny R
小行星音樂團隊
動畫: Kanauru
舞蹈動作攝影棚:Watson Amelia 工作室
編舞: Takanashi Kiara

2022-12-26

[PowerShell][學習筆記] excel工作表搬移

接續  [PowerShell][學習筆記] excel讀取

我們得知如何讀取 excel工作表

有時候在公司做報表需要不變格式,但要搬移工作表位置,將最前面搬到最後面

目前已知道可以用.move這個方法來搬移工作表到某個工作表"之前"

就可以用以下方式搬移工作表 

2022-12-24

[PowerShell][學習筆記] excel讀取

1.需安裝office,使用excel內的excel com模組

2.執行 $objExcel = New-Object -ComObject Excel.Application
#載入excel程式

3.$活頁簿 = $objExcel.Workbooks.Open( "檔案位置" )
#開啟指定路徑的檔案(在背景執行)

4.$工作表 =$活頁簿.sheets.item(1)
#執行活頁簿第1個工作表;可使用"工作表名稱"

5.
$工作表.UsedRange.Rows.Count
#計算工作表使用的"列"
$工作表.UsedRange.Columns.Count
#計算工作表使用的"行"

6.$變數=$工作表.Range("B1:B32")
#將B1:B32儲存格資料回傳到變數內
##$工作表.Range("B1")
##回傳B1儲存格
###$工作表.Cells.Item(21,2)
###回傳行2,列21儲存格

7.$變數.Cells.Find(關鍵字).Text
#範圍內的工作表搜尋關鍵字,並只要text屬性(.Cells.Find只會找到第一個值)

8.#釋放資源
$WorkBook.Close()
$objExcel.Quit()
$objExcel = $null
[System.GC]::Collect()

#如果沒釋放乾淨可以用工作管理員關閉excel

2022-08-06

[cmd]InstallShield Wizard 安裝包 指令

 

InstallShield Wizard 安裝包不像Windows Installer 封裝 (.msi) 使用命令提示字元開啟使用 /?可以查詢指令訊息
 
Windows Installer /?
 
經過東翻西找,終於找到此安裝包的相關指令

2022-07-29

[cmd]利用保護螢幕裝置關螢幕不關喇叭(關螢幕聽歌)

為了省錢,你買了螢幕附帶了喇叭,睡前想聽歌又不想要螢幕太亮

有什麼辦法能夠關閉螢幕又可以聽歌呢?

如標題所示,就是利用保護螢幕裝置

2022-06-27

[學習筆記][SQL]ORDER BY:排序

ORDER BY:排序,依字母順序,默認為ASC(英文為ascending,由小至大,上升之意)

反向則為DESC(英文為descending,由大至小,下降之意)

 


ORDER BY 1,3 ASC,column_name DESC

代表SELECT 的第1個欄位,也可用欄位名稱,若要做多欄位排序用"逗號"區隔欄位