להורדה | נר תמיד - תוכנה לשמירת המסך דלוק בתוכנות מסויימות - לפי בחירה
-
יצרתי תוכנה קטנה ששומרת על כך שהמסך לא יכבה בעת שימוש בתוכנות מסויימות - לפי הגדרה אישית שלכם.
הנה "נר תמיד" - תוכנה קטנה ממש (GPT ּ ג'מיני), שרצה ברקע ושומרת שבעת עבודה על אוצריא/זית/כרום ועוד רשימה של תוכנות, או כל תוכנה אחרת שתוסיפו לרשימה - המסך לא יכבה.
- היא נמצאת במגש, ואפשר בכל רגע נתון לכבות ולסגור אותה משם, או ממנהל המשימות.
בכבוד!

- התוכנה מזהה אם אוצריא לדוגמא, פתוח ברקע, אם כן - המסך לא נכבה בכלל, אם לא - המסך עובד כרגיל.
- יש אפשרות להפעיל ולכבות את התוכנה, גם בלי לסגור אותה.
- יש אפשרות שהתוכנה תפעל עם עליית המחשב - באופן אוטומטי.
- יש בועת מידע אם התוכנה מופעלת/נכבית - בכדי שתדעו בדיוק מה הסטטוס שלה.
- התוכנה רצה ברקע, ופועלת משורת המשימות.
אשמח להערות!
תמונות בספויילר








הנה הקוד בפאוורשיל - למי שרוצה לעבור עליו:
# התחלה שקטה ונקייה - ביטול כל הפלט המיותר $ErrorActionPreference = 'SilentlyContinue' [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") # בדיקה שהתוכנה לא רצה כבר if ((Get-Process -Name ([System.Diagnostics.Process]::GetCurrentProcess().Name) -ErrorAction SilentlyContinue).Count -gt 1) { exit } # הגדרת Registry (במקום קבצים) $RegKey = "HKCU:\Software\NerTamid" if (!(Test-Path $RegKey)) { [void](New-Item $RegKey -Force) } # API $sig = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);' $win32 = Add-Type -MemberDefinition $sig -Name "Win32Sleep" -Namespace "Win32" -PassThru # --- טעינת נתונים --- # 1. רשימת ברירת מחדל (תמיד תופיע) $script:AvailableApps = [ordered]@{ "אוצריא"="otzaria"; "זית"="Zayit"; "פרויקט השות"="Responsa"; "אוצר החכמה"="Otzar"; "תורת אמת"="ToratEmet"; "מאגר DBS"="DBS"; "Word"="WINWORD"; "Excel"="EXCEL"; "PowerPoint"="POWERPNT"; "Chrome"="chrome"; "Edge"="msedge"; "Zoom"="Zoom" } # 2. טעינת תוכנות אישיות שהמשתמש הוסיף בעבר מה-Registry $customStored = (Get-ItemProperty $RegKey -Name "CustomApps" -ErrorAction SilentlyContinue).CustomApps if ($customStored) { foreach ($pair in ($customStored -split ",")) { if ($pair -match "=") { $k,$v = $pair -split "=" if (-not $script:AvailableApps.Contains($k)) { $script:AvailableApps[$k] = $v } } } } # 3. טעינת הבחירות של המשתמש $script:SelectedProcesses = (Get-ItemProperty $RegKey -Name "Selected" -ErrorAction SilentlyContinue).Selected -split "," $script:ManualOverride = $true # אייקון ראשי $ExePath = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName try { $script:MainIcon = [System.Drawing.Icon]::ExtractAssociatedIcon($ExePath) } catch { $script:MainIcon = [System.Drawing.SystemIcons]::Application } $notifyIcon = New-Object System.Windows.Forms.NotifyIcon -Property @{Icon=$script:MainIcon; Visible=$true; Text="נר תמיד"} function Show-Toast ($title, $msg) { $notifyIcon.ShowBalloonTip(3000, $title, $msg, [System.Windows.Forms.ToolTipIcon]::Info) } # פונקציית הליבה function Update-SleepState ($showMsg = $false) { $AnyRunning = $false # בדיקת תוכנות ועדכון אייקונים בזיכרון foreach ($appName in $script:AvailableApps.Keys) { $pName = $script:AvailableApps[$appName] # האם התוכנה רצה כרגע? $p = Get-Process -Name "$pName*" -ErrorAction SilentlyContinue | Select -First 1 if ($p) { # אם היא רצה והמשתמש בחר בה - נמנע כיבוי if ($script:SelectedProcesses -contains $pName) { $AnyRunning = $true } # "לכידת" האייקון ושמירתו ב-Registry אם טרם נשמר if (!(Get-ItemProperty $RegKey -Name "Icon_$pName" -ErrorAction SilentlyContinue)) { try { $ms = New-Object System.IO.MemoryStream [System.Drawing.Icon]::ExtractAssociatedIcon($p.MainModule.FileName).ToBitmap().Save($ms, [System.Drawing.Imaging.ImageFormat]::Png) [void](Set-ItemProperty $RegKey -Name "Icon_$pName" -Value ([Convert]::ToBase64String($ms.ToArray()))) } catch {} } } } # קביעת מצב השינה $flags = if ($script:ManualOverride -and $AnyRunning) { [uint32]0x80000003 } else { [uint32]0x80000000 } [void][Win32.Win32Sleep]::SetThreadExecutionState($flags) # הצגת הודעה רק אם התבקשה (למשל בלחיצה ידנית) if ($showMsg) { $status = if ($script:ManualOverride) { "מופעלת" } else { "מושבתת" } Show-Toast "נר תמיד" "מניעת כיבוי $status" } } # חלון אודות - כולל קישור function Show-About { $a = New-Object System.Windows.Forms.Form -Property @{Text="אודות"; Size="350,180"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterParent"; Icon=$script:MainIcon; FormBorderStyle="FixedDialog"; MaximizeBox=$false} $l = New-Object System.Windows.Forms.Label -Property @{Text="פותח על ידי יאיר דניאל מפורום מתמחים טופ"; AutoSize=$true; Location="30,30"} $lnk = New-Object System.Windows.Forms.LinkLabel -Property @{Text="למעבר לפרופיל המפתח לחץ כאן"; AutoSize=$true; Location="30,70"} $lnk.Add_Click({ [System.Diagnostics.Process]::Start("https://mitmachim.top/user/%D7%99%D7%90%D7%99%D7%A8-%D7%93%D7%A0%D7%99%D7%90%D7%9C") }) $a.Controls.AddRange(@($l, $lnk)) $a.ShowDialog() } # חלון הגדרות function Show-Settings { $s = New-Object System.Windows.Forms.Form -Property @{Text="הגדרות"; Size="300,250"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $chk = New-Object System.Windows.Forms.CheckBox -Property @{Text="הפעל עם עליית המחשב"; Location="30,30"; AutoSize=$true; Checked=(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -ErrorAction SilentlyContinue)} $btnA = New-Object System.Windows.Forms.Button -Property @{Text="אודות"; Location="30,70"; Size="220,35"} $btnA.Add_Click({ Show-About }) $btnS = New-Object System.Windows.Forms.Button -Property @{Text="שמור וסגור"; Location="30,120"; Size="220,50"} $btnS.Add_Click({ if($chk.Checked){ [void](Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -Value $ExePath) } else{ [void](Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid") } $s.Close() }) $s.Controls.AddRange(@($chk, $btnA, $btnS)); $s.ShowDialog() } # חלון ניהול תוכנות function Show-AppSelection { $f = New-Object System.Windows.Forms.Form -Property @{Text="ניהול תוכנות"; Size="380,600"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $lv = New-Object System.Windows.Forms.ListView -Property @{View="Details"; CheckBoxes=$true; FullRowSelect=$true; Size="340,350"; Location="15,15"; SmallImageList=(New-Object System.Windows.Forms.ImageList -Property @{ImageSize="24,24"; ColorDepth="Depth32Bit"})} $lv.Columns.Add("שם התוכנה", 280) | Out-Null # מילוי הרשימה וטעינת אייקונים מה-Registry foreach ($name in $script:AvailableApps.Keys) { $p = $script:AvailableApps[$name] $item = New-Object System.Windows.Forms.ListViewItem($name) $item.Tag = $p $item.Checked = ($script:SelectedProcesses -contains $p) # שליפת אייקון שמור $b64 = (Get-ItemProperty $RegKey -Name "Icon_$p" -ErrorAction SilentlyContinue)."Icon_$p" if ($b64) { try { $bytes = [Convert]::FromBase64String($b64) $ms = New-Object System.IO.MemoryStream(,$bytes) $lv.SmallImageList.Images.Add([System.Drawing.Image]::FromStream($ms)) $item.ImageIndex = $lv.SmallImageList.Images.Count - 1 } catch {} } [void]$lv.Items.Add($item) } # כפתור הוספה $btnAdd = New-Object System.Windows.Forms.Button -Property @{Text="➕ הוסף תוכנה ידנית"; Location="15,380"; Size="340,40"} $btnAdd.Add_Click({ $n = [Microsoft.VisualBasic.Interaction]::InputBox("שם התוכנה להצגה:", "הוספה") if ($n) { $h = "איך מוצאים שם תהליך?`n1. פתח את התוכנה שרצית.`n2. פתח מנהל משימות (Ctrl+Shift+Esc)`n3. בלשונית 'פרטים' העתק את השם בלי ה- .exe" $p = [Microsoft.VisualBasic.Interaction]::InputBox($h, "הזן שם תהליך (למשל: WINWORD)", $n) if ($p) { # הוספה לרשימה הנוכחית ול-Registry $script:AvailableApps[$n]=$p # שמירת רשימת ה-Custom ל-Registry כדי שתופיע בפעם הבאה $customList = New-Object System.Collections.Generic.List[string] foreach ($k in $script:AvailableApps.Keys) { # אם זו לא תוכנת ברירת מחדל, נשמור אותה if (-not ("אוצריא","זית","פרויקט השות","אוצר החכמה","תורת אמת","מאגר DBS","Word","Excel","PowerPoint","Chrome","Edge","Zoom" -contains $k)) { $customList.Add("$k=$($script:AvailableApps[$k])") } } [void](Set-ItemProperty $RegKey -Name "CustomApps" -Value ($customList -join ",")) $f.Close(); Show-AppSelection # רענון } } }) $btnSave = New-Object System.Windows.Forms.Button -Property @{Text="שמור שינויים"; Location="15,440"; Size="340,50"} $btnSave.Add_Click({ $sel = New-Object System.Collections.Generic.List[string] foreach($i in $lv.CheckedItems){$sel.Add($i.Tag)} $script:SelectedProcesses = $sel [void](Set-ItemProperty $RegKey -Name "Selected" -Value ($script:SelectedProcesses -join ",")) Update-SleepState Show-Toast "נר תמיד" "השינויים נשמרו בהצלחה" $f.Close() }) $f.Controls.AddRange(@($lv, $btnAdd, $btnSave)) $f.ShowDialog() } # תפריט קליק ימני $menu = New-Object System.Windows.Forms.ContextMenu $mToggle = New-Object System.Windows.Forms.MenuItem("מניעת כיבוי פעילה", { $script:ManualOverride = -not $script:ManualOverride $this.Checked = $script:ManualOverride # כאן הפעלנו את ה-ShowMsg = True Update-SleepState $true }) $mToggle.Checked = $true $mApps = New-Object System.Windows.Forms.MenuItem("ניהול תוכנות", { Show-AppSelection }) $mSettings = New-Object System.Windows.Forms.MenuItem("הגדרות", { Show-Settings }) $mExit = New-Object System.Windows.Forms.MenuItem("יציאה", { $notifyIcon.Visible=$false; [System.Windows.Forms.Application]::Exit(); Stop-Process -Id $PID -Force }) $menu.MenuItems.AddRange(@($mToggle, $mApps, $mSettings, $mExit)) $notifyIcon.ContextMenu = $menu # טיימר $timer = New-Object System.Windows.Forms.Timer -Property @{Interval = 30000} $timer.Add_Tick({ Update-SleepState }) $timer.Start() # הודעת פתיחה Show-Toast "נר תמיד" "הלימוד שלך לא נעצר. גם המסך לא נכבה." Update-SleepState [System.Windows.Forms.Application]::Run()יש לתוכנה שני גירסאות קודמות - אם זה מעניין מישהו...
גירסה ראשונה:
אוצריא - שומר מסך
שומר מסך - מיועד לתוכנת אוצריא בלבד.

אוצריא שומר מסך.exeגירסה שניה:
נר תמיד - שומר מסך לאוצריא וזית
תוכנה לשמירת המסך בעת שימוש בתוכנות אוצריא וזית

nertamid.exe -
יצרתי תוכנה קטנה ששומרת על כך שהמסך לא יכבה בעת שימוש בתוכנות מסויימות - לפי הגדרה אישית שלכם.
הנה "נר תמיד" - תוכנה קטנה ממש (GPT ּ ג'מיני), שרצה ברקע ושומרת שבעת עבודה על אוצריא/זית/כרום ועוד רשימה של תוכנות, או כל תוכנה אחרת שתוסיפו לרשימה - המסך לא יכבה.
- היא נמצאת במגש, ואפשר בכל רגע נתון לכבות ולסגור אותה משם, או ממנהל המשימות.
בכבוד!

- התוכנה מזהה אם אוצריא לדוגמא, פתוח ברקע, אם כן - המסך לא נכבה בכלל, אם לא - המסך עובד כרגיל.
- יש אפשרות להפעיל ולכבות את התוכנה, גם בלי לסגור אותה.
- יש אפשרות שהתוכנה תפעל עם עליית המחשב - באופן אוטומטי.
- יש בועת מידע אם התוכנה מופעלת/נכבית - בכדי שתדעו בדיוק מה הסטטוס שלה.
- התוכנה רצה ברקע, ופועלת משורת המשימות.
אשמח להערות!
תמונות בספויילר








הנה הקוד בפאוורשיל - למי שרוצה לעבור עליו:
# התחלה שקטה ונקייה - ביטול כל הפלט המיותר $ErrorActionPreference = 'SilentlyContinue' [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") # בדיקה שהתוכנה לא רצה כבר if ((Get-Process -Name ([System.Diagnostics.Process]::GetCurrentProcess().Name) -ErrorAction SilentlyContinue).Count -gt 1) { exit } # הגדרת Registry (במקום קבצים) $RegKey = "HKCU:\Software\NerTamid" if (!(Test-Path $RegKey)) { [void](New-Item $RegKey -Force) } # API $sig = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);' $win32 = Add-Type -MemberDefinition $sig -Name "Win32Sleep" -Namespace "Win32" -PassThru # --- טעינת נתונים --- # 1. רשימת ברירת מחדל (תמיד תופיע) $script:AvailableApps = [ordered]@{ "אוצריא"="otzaria"; "זית"="Zayit"; "פרויקט השות"="Responsa"; "אוצר החכמה"="Otzar"; "תורת אמת"="ToratEmet"; "מאגר DBS"="DBS"; "Word"="WINWORD"; "Excel"="EXCEL"; "PowerPoint"="POWERPNT"; "Chrome"="chrome"; "Edge"="msedge"; "Zoom"="Zoom" } # 2. טעינת תוכנות אישיות שהמשתמש הוסיף בעבר מה-Registry $customStored = (Get-ItemProperty $RegKey -Name "CustomApps" -ErrorAction SilentlyContinue).CustomApps if ($customStored) { foreach ($pair in ($customStored -split ",")) { if ($pair -match "=") { $k,$v = $pair -split "=" if (-not $script:AvailableApps.Contains($k)) { $script:AvailableApps[$k] = $v } } } } # 3. טעינת הבחירות של המשתמש $script:SelectedProcesses = (Get-ItemProperty $RegKey -Name "Selected" -ErrorAction SilentlyContinue).Selected -split "," $script:ManualOverride = $true # אייקון ראשי $ExePath = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName try { $script:MainIcon = [System.Drawing.Icon]::ExtractAssociatedIcon($ExePath) } catch { $script:MainIcon = [System.Drawing.SystemIcons]::Application } $notifyIcon = New-Object System.Windows.Forms.NotifyIcon -Property @{Icon=$script:MainIcon; Visible=$true; Text="נר תמיד"} function Show-Toast ($title, $msg) { $notifyIcon.ShowBalloonTip(3000, $title, $msg, [System.Windows.Forms.ToolTipIcon]::Info) } # פונקציית הליבה function Update-SleepState ($showMsg = $false) { $AnyRunning = $false # בדיקת תוכנות ועדכון אייקונים בזיכרון foreach ($appName in $script:AvailableApps.Keys) { $pName = $script:AvailableApps[$appName] # האם התוכנה רצה כרגע? $p = Get-Process -Name "$pName*" -ErrorAction SilentlyContinue | Select -First 1 if ($p) { # אם היא רצה והמשתמש בחר בה - נמנע כיבוי if ($script:SelectedProcesses -contains $pName) { $AnyRunning = $true } # "לכידת" האייקון ושמירתו ב-Registry אם טרם נשמר if (!(Get-ItemProperty $RegKey -Name "Icon_$pName" -ErrorAction SilentlyContinue)) { try { $ms = New-Object System.IO.MemoryStream [System.Drawing.Icon]::ExtractAssociatedIcon($p.MainModule.FileName).ToBitmap().Save($ms, [System.Drawing.Imaging.ImageFormat]::Png) [void](Set-ItemProperty $RegKey -Name "Icon_$pName" -Value ([Convert]::ToBase64String($ms.ToArray()))) } catch {} } } } # קביעת מצב השינה $flags = if ($script:ManualOverride -and $AnyRunning) { [uint32]0x80000003 } else { [uint32]0x80000000 } [void][Win32.Win32Sleep]::SetThreadExecutionState($flags) # הצגת הודעה רק אם התבקשה (למשל בלחיצה ידנית) if ($showMsg) { $status = if ($script:ManualOverride) { "מופעלת" } else { "מושבתת" } Show-Toast "נר תמיד" "מניעת כיבוי $status" } } # חלון אודות - כולל קישור function Show-About { $a = New-Object System.Windows.Forms.Form -Property @{Text="אודות"; Size="350,180"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterParent"; Icon=$script:MainIcon; FormBorderStyle="FixedDialog"; MaximizeBox=$false} $l = New-Object System.Windows.Forms.Label -Property @{Text="פותח על ידי יאיר דניאל מפורום מתמחים טופ"; AutoSize=$true; Location="30,30"} $lnk = New-Object System.Windows.Forms.LinkLabel -Property @{Text="למעבר לפרופיל המפתח לחץ כאן"; AutoSize=$true; Location="30,70"} $lnk.Add_Click({ [System.Diagnostics.Process]::Start("https://mitmachim.top/user/%D7%99%D7%90%D7%99%D7%A8-%D7%93%D7%A0%D7%99%D7%90%D7%9C") }) $a.Controls.AddRange(@($l, $lnk)) $a.ShowDialog() } # חלון הגדרות function Show-Settings { $s = New-Object System.Windows.Forms.Form -Property @{Text="הגדרות"; Size="300,250"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $chk = New-Object System.Windows.Forms.CheckBox -Property @{Text="הפעל עם עליית המחשב"; Location="30,30"; AutoSize=$true; Checked=(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -ErrorAction SilentlyContinue)} $btnA = New-Object System.Windows.Forms.Button -Property @{Text="אודות"; Location="30,70"; Size="220,35"} $btnA.Add_Click({ Show-About }) $btnS = New-Object System.Windows.Forms.Button -Property @{Text="שמור וסגור"; Location="30,120"; Size="220,50"} $btnS.Add_Click({ if($chk.Checked){ [void](Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -Value $ExePath) } else{ [void](Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid") } $s.Close() }) $s.Controls.AddRange(@($chk, $btnA, $btnS)); $s.ShowDialog() } # חלון ניהול תוכנות function Show-AppSelection { $f = New-Object System.Windows.Forms.Form -Property @{Text="ניהול תוכנות"; Size="380,600"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $lv = New-Object System.Windows.Forms.ListView -Property @{View="Details"; CheckBoxes=$true; FullRowSelect=$true; Size="340,350"; Location="15,15"; SmallImageList=(New-Object System.Windows.Forms.ImageList -Property @{ImageSize="24,24"; ColorDepth="Depth32Bit"})} $lv.Columns.Add("שם התוכנה", 280) | Out-Null # מילוי הרשימה וטעינת אייקונים מה-Registry foreach ($name in $script:AvailableApps.Keys) { $p = $script:AvailableApps[$name] $item = New-Object System.Windows.Forms.ListViewItem($name) $item.Tag = $p $item.Checked = ($script:SelectedProcesses -contains $p) # שליפת אייקון שמור $b64 = (Get-ItemProperty $RegKey -Name "Icon_$p" -ErrorAction SilentlyContinue)."Icon_$p" if ($b64) { try { $bytes = [Convert]::FromBase64String($b64) $ms = New-Object System.IO.MemoryStream(,$bytes) $lv.SmallImageList.Images.Add([System.Drawing.Image]::FromStream($ms)) $item.ImageIndex = $lv.SmallImageList.Images.Count - 1 } catch {} } [void]$lv.Items.Add($item) } # כפתור הוספה $btnAdd = New-Object System.Windows.Forms.Button -Property @{Text="➕ הוסף תוכנה ידנית"; Location="15,380"; Size="340,40"} $btnAdd.Add_Click({ $n = [Microsoft.VisualBasic.Interaction]::InputBox("שם התוכנה להצגה:", "הוספה") if ($n) { $h = "איך מוצאים שם תהליך?`n1. פתח את התוכנה שרצית.`n2. פתח מנהל משימות (Ctrl+Shift+Esc)`n3. בלשונית 'פרטים' העתק את השם בלי ה- .exe" $p = [Microsoft.VisualBasic.Interaction]::InputBox($h, "הזן שם תהליך (למשל: WINWORD)", $n) if ($p) { # הוספה לרשימה הנוכחית ול-Registry $script:AvailableApps[$n]=$p # שמירת רשימת ה-Custom ל-Registry כדי שתופיע בפעם הבאה $customList = New-Object System.Collections.Generic.List[string] foreach ($k in $script:AvailableApps.Keys) { # אם זו לא תוכנת ברירת מחדל, נשמור אותה if (-not ("אוצריא","זית","פרויקט השות","אוצר החכמה","תורת אמת","מאגר DBS","Word","Excel","PowerPoint","Chrome","Edge","Zoom" -contains $k)) { $customList.Add("$k=$($script:AvailableApps[$k])") } } [void](Set-ItemProperty $RegKey -Name "CustomApps" -Value ($customList -join ",")) $f.Close(); Show-AppSelection # רענון } } }) $btnSave = New-Object System.Windows.Forms.Button -Property @{Text="שמור שינויים"; Location="15,440"; Size="340,50"} $btnSave.Add_Click({ $sel = New-Object System.Collections.Generic.List[string] foreach($i in $lv.CheckedItems){$sel.Add($i.Tag)} $script:SelectedProcesses = $sel [void](Set-ItemProperty $RegKey -Name "Selected" -Value ($script:SelectedProcesses -join ",")) Update-SleepState Show-Toast "נר תמיד" "השינויים נשמרו בהצלחה" $f.Close() }) $f.Controls.AddRange(@($lv, $btnAdd, $btnSave)) $f.ShowDialog() } # תפריט קליק ימני $menu = New-Object System.Windows.Forms.ContextMenu $mToggle = New-Object System.Windows.Forms.MenuItem("מניעת כיבוי פעילה", { $script:ManualOverride = -not $script:ManualOverride $this.Checked = $script:ManualOverride # כאן הפעלנו את ה-ShowMsg = True Update-SleepState $true }) $mToggle.Checked = $true $mApps = New-Object System.Windows.Forms.MenuItem("ניהול תוכנות", { Show-AppSelection }) $mSettings = New-Object System.Windows.Forms.MenuItem("הגדרות", { Show-Settings }) $mExit = New-Object System.Windows.Forms.MenuItem("יציאה", { $notifyIcon.Visible=$false; [System.Windows.Forms.Application]::Exit(); Stop-Process -Id $PID -Force }) $menu.MenuItems.AddRange(@($mToggle, $mApps, $mSettings, $mExit)) $notifyIcon.ContextMenu = $menu # טיימר $timer = New-Object System.Windows.Forms.Timer -Property @{Interval = 30000} $timer.Add_Tick({ Update-SleepState }) $timer.Start() # הודעת פתיחה Show-Toast "נר תמיד" "הלימוד שלך לא נעצר. גם המסך לא נכבה." Update-SleepState [System.Windows.Forms.Application]::Run()יש לתוכנה שני גירסאות קודמות - אם זה מעניין מישהו...
גירסה ראשונה:
אוצריא - שומר מסך
שומר מסך - מיועד לתוכנת אוצריא בלבד.

אוצריא שומר מסך.exeגירסה שניה:
נר תמיד - שומר מסך לאוצריא וזית
תוכנה לשמירת המסך בעת שימוש בתוכנות אוצריא וזית

nertamid.exe@יאיר-דניאל
נפלא. יישר כח.
א. אגב, זה לא זולל סוללה ברקע?
ב. הייתי שמח לרעיון לפיצ'ר שייתן אופציה בקלות לבטל כיבוי מסך ומצב שינה ולהפעיל בכפתור פשוט. -
@יאיר-דניאל
נפלא. יישר כח.
א. אגב, זה לא זולל סוללה ברקע?
ב. הייתי שמח לרעיון לפיצ'ר שייתן אופציה בקלות לבטל כיבוי מסך ומצב שינה ולהפעיל בכפתור פשוט.@הרוששיבע כתב בלהורדה | נר תמיד - תוכנה לשמירת המסך דלוק בתוכנות מסויימות - לפי בחירה:
א. אגב, זה לא זולל סוללה ברקע?
לפי בדיקה שלי - ממש לא, זה בקושי לוקח.
-
יצרתי תוכנה קטנה ששומרת על כך שהמסך לא יכבה בעת שימוש בתוכנות מסויימות - לפי הגדרה אישית שלכם.
הנה "נר תמיד" - תוכנה קטנה ממש (GPT ּ ג'מיני), שרצה ברקע ושומרת שבעת עבודה על אוצריא/זית/כרום ועוד רשימה של תוכנות, או כל תוכנה אחרת שתוסיפו לרשימה - המסך לא יכבה.
- היא נמצאת במגש, ואפשר בכל רגע נתון לכבות ולסגור אותה משם, או ממנהל המשימות.
בכבוד!

- התוכנה מזהה אם אוצריא לדוגמא, פתוח ברקע, אם כן - המסך לא נכבה בכלל, אם לא - המסך עובד כרגיל.
- יש אפשרות להפעיל ולכבות את התוכנה, גם בלי לסגור אותה.
- יש אפשרות שהתוכנה תפעל עם עליית המחשב - באופן אוטומטי.
- יש בועת מידע אם התוכנה מופעלת/נכבית - בכדי שתדעו בדיוק מה הסטטוס שלה.
- התוכנה רצה ברקע, ופועלת משורת המשימות.
אשמח להערות!
תמונות בספויילר








הנה הקוד בפאוורשיל - למי שרוצה לעבור עליו:
# התחלה שקטה ונקייה - ביטול כל הפלט המיותר $ErrorActionPreference = 'SilentlyContinue' [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") # בדיקה שהתוכנה לא רצה כבר if ((Get-Process -Name ([System.Diagnostics.Process]::GetCurrentProcess().Name) -ErrorAction SilentlyContinue).Count -gt 1) { exit } # הגדרת Registry (במקום קבצים) $RegKey = "HKCU:\Software\NerTamid" if (!(Test-Path $RegKey)) { [void](New-Item $RegKey -Force) } # API $sig = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);' $win32 = Add-Type -MemberDefinition $sig -Name "Win32Sleep" -Namespace "Win32" -PassThru # --- טעינת נתונים --- # 1. רשימת ברירת מחדל (תמיד תופיע) $script:AvailableApps = [ordered]@{ "אוצריא"="otzaria"; "זית"="Zayit"; "פרויקט השות"="Responsa"; "אוצר החכמה"="Otzar"; "תורת אמת"="ToratEmet"; "מאגר DBS"="DBS"; "Word"="WINWORD"; "Excel"="EXCEL"; "PowerPoint"="POWERPNT"; "Chrome"="chrome"; "Edge"="msedge"; "Zoom"="Zoom" } # 2. טעינת תוכנות אישיות שהמשתמש הוסיף בעבר מה-Registry $customStored = (Get-ItemProperty $RegKey -Name "CustomApps" -ErrorAction SilentlyContinue).CustomApps if ($customStored) { foreach ($pair in ($customStored -split ",")) { if ($pair -match "=") { $k,$v = $pair -split "=" if (-not $script:AvailableApps.Contains($k)) { $script:AvailableApps[$k] = $v } } } } # 3. טעינת הבחירות של המשתמש $script:SelectedProcesses = (Get-ItemProperty $RegKey -Name "Selected" -ErrorAction SilentlyContinue).Selected -split "," $script:ManualOverride = $true # אייקון ראשי $ExePath = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName try { $script:MainIcon = [System.Drawing.Icon]::ExtractAssociatedIcon($ExePath) } catch { $script:MainIcon = [System.Drawing.SystemIcons]::Application } $notifyIcon = New-Object System.Windows.Forms.NotifyIcon -Property @{Icon=$script:MainIcon; Visible=$true; Text="נר תמיד"} function Show-Toast ($title, $msg) { $notifyIcon.ShowBalloonTip(3000, $title, $msg, [System.Windows.Forms.ToolTipIcon]::Info) } # פונקציית הליבה function Update-SleepState ($showMsg = $false) { $AnyRunning = $false # בדיקת תוכנות ועדכון אייקונים בזיכרון foreach ($appName in $script:AvailableApps.Keys) { $pName = $script:AvailableApps[$appName] # האם התוכנה רצה כרגע? $p = Get-Process -Name "$pName*" -ErrorAction SilentlyContinue | Select -First 1 if ($p) { # אם היא רצה והמשתמש בחר בה - נמנע כיבוי if ($script:SelectedProcesses -contains $pName) { $AnyRunning = $true } # "לכידת" האייקון ושמירתו ב-Registry אם טרם נשמר if (!(Get-ItemProperty $RegKey -Name "Icon_$pName" -ErrorAction SilentlyContinue)) { try { $ms = New-Object System.IO.MemoryStream [System.Drawing.Icon]::ExtractAssociatedIcon($p.MainModule.FileName).ToBitmap().Save($ms, [System.Drawing.Imaging.ImageFormat]::Png) [void](Set-ItemProperty $RegKey -Name "Icon_$pName" -Value ([Convert]::ToBase64String($ms.ToArray()))) } catch {} } } } # קביעת מצב השינה $flags = if ($script:ManualOverride -and $AnyRunning) { [uint32]0x80000003 } else { [uint32]0x80000000 } [void][Win32.Win32Sleep]::SetThreadExecutionState($flags) # הצגת הודעה רק אם התבקשה (למשל בלחיצה ידנית) if ($showMsg) { $status = if ($script:ManualOverride) { "מופעלת" } else { "מושבתת" } Show-Toast "נר תמיד" "מניעת כיבוי $status" } } # חלון אודות - כולל קישור function Show-About { $a = New-Object System.Windows.Forms.Form -Property @{Text="אודות"; Size="350,180"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterParent"; Icon=$script:MainIcon; FormBorderStyle="FixedDialog"; MaximizeBox=$false} $l = New-Object System.Windows.Forms.Label -Property @{Text="פותח על ידי יאיר דניאל מפורום מתמחים טופ"; AutoSize=$true; Location="30,30"} $lnk = New-Object System.Windows.Forms.LinkLabel -Property @{Text="למעבר לפרופיל המפתח לחץ כאן"; AutoSize=$true; Location="30,70"} $lnk.Add_Click({ [System.Diagnostics.Process]::Start("https://mitmachim.top/user/%D7%99%D7%90%D7%99%D7%A8-%D7%93%D7%A0%D7%99%D7%90%D7%9C") }) $a.Controls.AddRange(@($l, $lnk)) $a.ShowDialog() } # חלון הגדרות function Show-Settings { $s = New-Object System.Windows.Forms.Form -Property @{Text="הגדרות"; Size="300,250"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $chk = New-Object System.Windows.Forms.CheckBox -Property @{Text="הפעל עם עליית המחשב"; Location="30,30"; AutoSize=$true; Checked=(Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -ErrorAction SilentlyContinue)} $btnA = New-Object System.Windows.Forms.Button -Property @{Text="אודות"; Location="30,70"; Size="220,35"} $btnA.Add_Click({ Show-About }) $btnS = New-Object System.Windows.Forms.Button -Property @{Text="שמור וסגור"; Location="30,120"; Size="220,50"} $btnS.Add_Click({ if($chk.Checked){ [void](Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid" -Value $ExePath) } else{ [void](Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "NerTamid") } $s.Close() }) $s.Controls.AddRange(@($chk, $btnA, $btnS)); $s.ShowDialog() } # חלון ניהול תוכנות function Show-AppSelection { $f = New-Object System.Windows.Forms.Form -Property @{Text="ניהול תוכנות"; Size="380,600"; RightToLeft="Yes"; RightToLeftLayout=$true; StartPosition="CenterScreen"; Icon=$script:MainIcon} $lv = New-Object System.Windows.Forms.ListView -Property @{View="Details"; CheckBoxes=$true; FullRowSelect=$true; Size="340,350"; Location="15,15"; SmallImageList=(New-Object System.Windows.Forms.ImageList -Property @{ImageSize="24,24"; ColorDepth="Depth32Bit"})} $lv.Columns.Add("שם התוכנה", 280) | Out-Null # מילוי הרשימה וטעינת אייקונים מה-Registry foreach ($name in $script:AvailableApps.Keys) { $p = $script:AvailableApps[$name] $item = New-Object System.Windows.Forms.ListViewItem($name) $item.Tag = $p $item.Checked = ($script:SelectedProcesses -contains $p) # שליפת אייקון שמור $b64 = (Get-ItemProperty $RegKey -Name "Icon_$p" -ErrorAction SilentlyContinue)."Icon_$p" if ($b64) { try { $bytes = [Convert]::FromBase64String($b64) $ms = New-Object System.IO.MemoryStream(,$bytes) $lv.SmallImageList.Images.Add([System.Drawing.Image]::FromStream($ms)) $item.ImageIndex = $lv.SmallImageList.Images.Count - 1 } catch {} } [void]$lv.Items.Add($item) } # כפתור הוספה $btnAdd = New-Object System.Windows.Forms.Button -Property @{Text="➕ הוסף תוכנה ידנית"; Location="15,380"; Size="340,40"} $btnAdd.Add_Click({ $n = [Microsoft.VisualBasic.Interaction]::InputBox("שם התוכנה להצגה:", "הוספה") if ($n) { $h = "איך מוצאים שם תהליך?`n1. פתח את התוכנה שרצית.`n2. פתח מנהל משימות (Ctrl+Shift+Esc)`n3. בלשונית 'פרטים' העתק את השם בלי ה- .exe" $p = [Microsoft.VisualBasic.Interaction]::InputBox($h, "הזן שם תהליך (למשל: WINWORD)", $n) if ($p) { # הוספה לרשימה הנוכחית ול-Registry $script:AvailableApps[$n]=$p # שמירת רשימת ה-Custom ל-Registry כדי שתופיע בפעם הבאה $customList = New-Object System.Collections.Generic.List[string] foreach ($k in $script:AvailableApps.Keys) { # אם זו לא תוכנת ברירת מחדל, נשמור אותה if (-not ("אוצריא","זית","פרויקט השות","אוצר החכמה","תורת אמת","מאגר DBS","Word","Excel","PowerPoint","Chrome","Edge","Zoom" -contains $k)) { $customList.Add("$k=$($script:AvailableApps[$k])") } } [void](Set-ItemProperty $RegKey -Name "CustomApps" -Value ($customList -join ",")) $f.Close(); Show-AppSelection # רענון } } }) $btnSave = New-Object System.Windows.Forms.Button -Property @{Text="שמור שינויים"; Location="15,440"; Size="340,50"} $btnSave.Add_Click({ $sel = New-Object System.Collections.Generic.List[string] foreach($i in $lv.CheckedItems){$sel.Add($i.Tag)} $script:SelectedProcesses = $sel [void](Set-ItemProperty $RegKey -Name "Selected" -Value ($script:SelectedProcesses -join ",")) Update-SleepState Show-Toast "נר תמיד" "השינויים נשמרו בהצלחה" $f.Close() }) $f.Controls.AddRange(@($lv, $btnAdd, $btnSave)) $f.ShowDialog() } # תפריט קליק ימני $menu = New-Object System.Windows.Forms.ContextMenu $mToggle = New-Object System.Windows.Forms.MenuItem("מניעת כיבוי פעילה", { $script:ManualOverride = -not $script:ManualOverride $this.Checked = $script:ManualOverride # כאן הפעלנו את ה-ShowMsg = True Update-SleepState $true }) $mToggle.Checked = $true $mApps = New-Object System.Windows.Forms.MenuItem("ניהול תוכנות", { Show-AppSelection }) $mSettings = New-Object System.Windows.Forms.MenuItem("הגדרות", { Show-Settings }) $mExit = New-Object System.Windows.Forms.MenuItem("יציאה", { $notifyIcon.Visible=$false; [System.Windows.Forms.Application]::Exit(); Stop-Process -Id $PID -Force }) $menu.MenuItems.AddRange(@($mToggle, $mApps, $mSettings, $mExit)) $notifyIcon.ContextMenu = $menu # טיימר $timer = New-Object System.Windows.Forms.Timer -Property @{Interval = 30000} $timer.Add_Tick({ Update-SleepState }) $timer.Start() # הודעת פתיחה Show-Toast "נר תמיד" "הלימוד שלך לא נעצר. גם המסך לא נכבה." Update-SleepState [System.Windows.Forms.Application]::Run()יש לתוכנה שני גירסאות קודמות - אם זה מעניין מישהו...
גירסה ראשונה:
אוצריא - שומר מסך
שומר מסך - מיועד לתוכנת אוצריא בלבד.

אוצריא שומר מסך.exeגירסה שניה:
נר תמיד - שומר מסך לאוצריא וזית
תוכנה לשמירת המסך בעת שימוש בתוכנות אוצריא וזית

nertamid.exe@יאיר-דניאל תוכנה חמודה בהחלט.
רק אומר שקיים פיצ'ר כזה בpowertoys בשם awake
שמאפשר לבחור להשאיר את המחשב דולק לתמיד לזמן מסוים ועוד.
(סמל של כוס קפה שמופיע בשורת המשימות למי שתוהה) -
@יאיר-דניאל תוכנה חמודה בהחלט.
רק אומר שקיים פיצ'ר כזה בpowertoys בשם awake
שמאפשר לבחור להשאיר את המחשב דולק לתמיד לזמן מסוים ועוד.
(סמל של כוס קפה שמופיע בשורת המשימות למי שתוהה) -
@יאיר-דניאל תוכנה חמודה בהחלט.
רק אומר שקיים פיצ'ר כזה בpowertoys בשם awake
שמאפשר לבחור להשאיר את המחשב דולק לתמיד לזמן מסוים ועוד.
(סמל של כוס קפה שמופיע בשורת המשימות למי שתוהה)@cfopuser זה לכלכ התוכנות.
הקטע של @יאיר-דניאל - שאתה בוחר תוכנות שרק במידה והם פועלות, המחשב ישאר ער. -
@cfopuser כתב בלהורדה | נר תמיד - תוכנה לשמירת המסך דלוק בתוכנות מסויימות - לפי בחירה:
רק אומר שקיים פיצ'ר כזה בpowertoys בשם awake
שמאפשר לבחור להשאיר את המחשב דולק לתמיד לזמן מסוים ועוד.אתה יכול לתת יותר פרטים על התוכנה הזו?
@הרוששיבע כתב בלהורדה | נר תמיד - תוכנה לשמירת המסך דלוק בתוכנות מסויימות - לפי בחירה:
אתה יכול לתת יותר פרטים על התוכנה הזו?
https://mitmachim.top/post/1003857
-
@יאיר-דניאל התוכנה גם מונעת לעבור למצב שינה רגיל / היברידי ?
רעיון מעולה ונצרך לתוכנה כזאת
יישר כח!!! -
@יאיר-דניאל התוכנה גם מונעת לעבור למצב שינה רגיל / היברידי ?
רעיון מעולה ונצרך לתוכנה כזאת
יישר כח!!!@מגוון לא
-
@מגוון לא