發表文章

C# 讓電腦不要進入螢幕保護狀態 do not let windows into screen saver(lock)

圖片
 對不起,管理員 因為公司強迫要求使用者未使用電腦情況下,5分鐘要鎖定螢幕,由於是使用AD強制控制,所以使用者沒有辦法自己去關閉。 而我,因為常有需要參考畫面上的內容,在另外一部電腦操作,因此導致這部電腦一直會進入螢幕鎖定。超級麻煩又討厭。 所以開發了一隻小程式來防止Windows進入螢幕鎖定狀態。   程式下載(我只想使用): 這裡   密碼:radio-idea.blogspot.com   平台:.Net FrameWork 4.5   注意:可能會與軟體KVM衝突 這是利用Timer不斷偵測 Idle 時間 而這個 Idle 時間則是利用 GetLastInputInfo 取得鍵盤滑鼠輸入的最後時間計算與現在的時間差得到的,當這個時間差超過預定檢測的時間(我的程式碼是設定4分鐘,因為進入螢幕鎖定是5分鐘)時,會去模擬滑鼠輸入動作,這個模擬動作是透過SendInput來達成,以上這些功能都是呼叫Windows API來處理。 由於Windows API是非託管程序(Unmanaged)因此得引用 using System.Runtime.InteropServices; 主程序: using  System; using  System.Windows.Forms; using  System.Runtime.InteropServices; using  System.Configuration; namespace  DONTSLEEP {      public partial class   Form1 : Form     {          public int  Idle_time = 240; //閒置秒數(4分鐘)          public int  CCount = 0;          public bool  shacking =  false ;                   public enum   MonitorState   : int         {             MONITOR_ON = -1,             MONITOR_OFF = 2,            

財政部電子發票平台 Turnkey 接收檔案檢測程式(小工具)

圖片
Turnkey 是財政部電子發票平台的一套傳送工具 說真的,這套工具還蠻陽春的,對於有獨立伺服器的公司來說,不是很好用。 首先,它必須在使用者登入的桌面中執行,無法作為服務使用 其次,它執行排程時,背後一堆開啟的視窗不能關掉 最後,處理狀況的查詢,只能在該機器上直接查詢,無法透過遠端查詢(這個真的麻煩,尤其伺服器不能隨便把帳號密碼給使用者) 這次會開發這個工具的原因在於, 財務單位她們有自己的系統會產生傳給Turnkey的XML檔案,並直接丟到Turnkey處理的資料夾下 有時後,財務的系統沒有正常產生,導致電子發票平台一直沒收到資料,搞到去懷疑Turnkey主機有問題。 因此,特別開發這樣的程式來檢測Turnkey處理資料夾下是否有檔案被丟進來,並且整理後發郵件告知使用者。 先看看Turnkey處理資料檔案的類型與結構 相對於Turnkey處理黨案的預設路徑在 C:\Program Files\EINVTurnkey\UpCast 該路徑下的資料夾結構會有對應的名稱 下面還有分類資料夾: 每個分類資料夾下還會有3個資料夾,分別是SRC、BAK、ERR 通常新進來的檔案都會放在SRC裏面,經由Turnkeyt處理以後會從SRC移除並分類放在BAK和ERR裏面 所以這支程式就是專門在偵測SRC的檔案出現,並收集檔案名稱並以郵件回報給相關使用者 程式名稱:TKReceiveDetect.exe ( 下載 ) 環境需求:dotNetFrameWork 4.5 它的偵測方式不是用定時檢查,而是使用Windows的是件觸發,因為定時檢查的間隔可能會造成檢查遺失,就是當檔案進入SRC資料夾後,直到Turnkey排程觸發取走檔案時,如果定時檢查錯過這段時間這時就會檢查不到,而若把定時檢查設定太短,則會削弱大量系統效能(檢查這些資料夾必須使用遞迴處理),而且檢查時,若檔案此時被Turnkey處理掉,也是會造成偵測漏洞。 使用事件觸發通知好處是非常即時,而且事件被觸發時就會告知目前檔案狀況。因此不會漏掉要接收的資訊。

C# LINQ語法與SQL語法

圖片
  LINQ語法其實跟SQL語法還蠻像的,說蠻像基本上就是拿SQL語法來程式內使用而已。 學習過SQL的人太概都知道SQL的好處,雖說不上萬能,但是在找尋資料時卻是很好用的一種語法。 很多時候,不靠SQL資料庫要處理龐大內存資料真是一種痛苦,由其是不靠資料庫處理大量檔案資料或是內存資料時就是如此。如果有兩種資料須要JOIN就會需要很多程式碼,很多for/foreach迴圈去跑,因此總會希望程式碼在處理內存資料時會有像SQL這樣簡單的語法可以使用。 當然很多地方大都有在說LINQ和SQL的詳細寫法,我這邊也不再描述,我這邊主要是讓大家看看這兩種語法相似之處。 假如我有兩個資料表 學生基本資料(Student) 和 學等(Grade): Student StudentID Name Gender AddressCity AddressArea A0001 吳山汝 Female 台北市 萬華區 A0045 卓凱耀 Male 台中市 北區 A0107 劉立沛 Male 高雄市 鼓山區 Grade StudentID Class Score A0001 1.4 550 A0045 2.5 490 A0107 3.1 581 我們看看 幾個比較 假如我要選取學生資料表(Student)裏面的姓名(Name),然後過濾條件是住在台中市(AddressCity)會怎麼做呢? SQL語法: Select a.Name From Student a Where a.AddressCity = '台中市' 這三行分別就是: 選擇輸出的資料欄(Select) 資料來源(From) 過濾條件(Where) 注意: SQL對指令沒有大小寫分別,對字串不是使用雙引號,而是單引號 其中那個 a 是『別名』 如果用LINQ來寫,就會像如下: var result = ( from a in Student                       where a.AddressCity == "台中市"                      

Arduino [7SEGX8] 七段顯示器x2 使用74HC164驅動

圖片
這是一塊2排4位數7段顯示器(共8位數)的板子,由2顆74HC164控制,它的線路非常的單純排除電源之外,就只有DATA和CLOCK兩個訊號源而已。 由於它是由74HC164組成,所以資料傳輸方式就是使用位元資料PUSH出去的方式: shiftOut (data_pin, clk_pin, MSBFIRST , ~output[index]); shiftOut (data_pin, clk_pin, MSBFIRST , 1<<index); delayMicroseconds (delayTime); 從上面的範例有執行兩次shiftOut的動作 第一次是送顯示位元(bit)送出去 第二次是重送定位(Digit)第幾位數 第三行是delayMicroseconds是顯示停留時間      顯示停留時間如果太短,你會幾乎看不到顯示的數字,顯示時間太久,你會看到一個數字一個數字的移動,因為這個設計一次只能顯示一個位置的一個數字,然後利用快速切換將每個位置的數字依序跑一遍。然後利用視覺暫留的時間讓你的眼睛看到該數字出現在那裏。 模組樣式 這個模組顯示方式從第 0 位置到 7 位置,從左上方開始,於右下方結束 0 →1→2→3 4→5→6→7 這次我們做個計數器來測試,接線方式如下: 程式碼如下: #define data_pin  2 #define clk_pin   3 int16_t delayTime = 2500; // 顯示暫留時間 / / 顯示七節字碼 [0,1,2,3,4,5,6,7,8,9,空] // B00111111,B00000110,B01011011,B01001111,B01101101,B01111101,B00000111,B0111111,B01101111,B00000000 uint8_t seg7[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F , 0x00}; uint8_t output[8]; long count = 0; void setup() {   // 設定輸出   pinMode (clk_pin, OUTPUT );   pinMode (data_p

C# 自訂 XCOPY 類別 :複製資料夾內所有檔案與子資料夾內容到目的資料夾(並覆蓋)

圖片
Xopy.class using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Tools {     public class Xcopy     {         private string _message;         /// <summary>         /// 錯誤訊息         /// </summary>         public string Message         {             get { return _message; }         }         /// <summary>         /// 複製檔案群         /// </summary>         /// <param name="_source">來源資料夾</param>         /// <param name="_target">目的資料夾</param>         /// <param name="recursive">包含子資料夾</param>         /// <returns>成功 = 1 , 失敗 = -1</returns>         public int Copy(string _source, string _target, bool recursive = true)         {             try             {                 if (!Directory.Exists(_source))                 {                     _message = "來源資料夾不存在!";                     return

LaunchMan : start and check version and update 自訂啟動更新程式

圖片
  說明: 這支程式的用途就是和你的程式擺在一起,然後將這支程式設定成你的程式啟動用。 這支程式啟動時,會依照 INI檔的設定去幫你檢查程式版本。 如果有版本異動時,會提醒使用者要更新程式。 支援: 支援HTTP和FTP協定,可以依照你的需求把更新檔案放在WEB server或是FTP server上 環境: 僅能運行在Windows 下 由 dotNet 4.5 開發,需要作業系統支援 dotNet 4.5 的程式執行, 如果沒有,可以 下載安裝 dotNet FrameWork 4.5 套件 。 下載: LaunchMan 範例: 我有一個 kiosk 程式 main.exe 放在  C:\APP\KioskPatch 桌面上有個程式捷徑連結到 C:\APP\KioskPatch\main.exe 現在,我們把 LaunchMan 程式和這個 Kiosk 程式放在一起 (不放一起其實也可以,這樣比較好管) 修改桌面捷徑改連結到 C:\APP\KioskPatch\LaunchMan.exe 而更新檔案 有兩個 一個是 version.txt , 另一個為壓縮檔( 例如KioskPatch.ZIP ) 都放在我的網站 www.mycomp.com.tw/Patch/down/ 下 然後在 C:\APP\KioskPatch 下也放一個 version.txt 這兩個 version.txt 內容要不一樣,當內容不同時,才會啟動更新 然後,修改 INI 檔案(範例在下方) [Application] ;使用的背景圖片,自訂圖片,該圖片必須有DPI資訊才能正常顯示 LogoPicture=splash2.png ;淡入效果時間 ;Second unit FadeINDuration=3 FadeOutDuration=1 ;讓背景透明 BackgroundTransparency=true ;顯示訊息文字顏色/位置 MessageTextColor=#0000FF MessageLeftPosition=10 messageTopPosition=130 Title="Kiosk Sell System with .Net" TitleTextColor=#FF0000 TitleLeftPosition=50

C# csv 檔匯入 List 一行搞定

圖片
  我有一個CSV 檔案(data.csv),內容大約如下: 編號,姓名,性別 T001,林黃頻,男 T002,江國勘,男 T003,劉簿相,男 所以,依照欄位我會定義出一個儲存用類別(Field.cs): namespace MyApp {     class Field     {         public Field(string Line)         {             var sp = Line.Split(',');             UserNo = sp[0];             UserName = sp[1];             Gender = sp[2];         }         public string UserNo { get; set; }         public string UserName { get; set; }         public string Gender { get; set; }                 public override string ToString()         {             string output =  UserNo+ "\t" + UserName + "\t" + Gender + "\r\n";             return output;         }     } } 主要程式碼其實只要一行就可以搞定(不含using) using System.IO ‧ ‧ ‧ // 這一行讀入CSV併排除第一行標題 List<Field> content = File.ReadAllLines("D:\\data.csv", Encoding.Default).Select(line => new Data1(line)).Skip(1).ToList(); // 顯示出來 foreach(Data1 item in totl) {      textBox1.Text += item.ToString(); } ‧ ‧ ‧