跳到主要內容

發表文章

目前顯示的是 2016的文章

How to remove a substring via batch command

Here is a tip to remove a substring via batch command For example: If I'd like to remove file extension name  from  Install .wim to  Install We can try below command: Test.cmd SET WINPE=%1 echo %WINPE% SET WINPE=%WINPE:.wim=% echo %WINPE% Input:  Test.cmd Install.wim Output:  Install REF: http://www.dostips.com/DtTipsStringManipulation.php

[Batch][loop] Recurse find specified file and do something

Assume you need to update many  Setting.xml  in the specified directory and they locate on different sub-folders. You can copy&past one-by-one if you have a lot of time to do this. Or you can try below batch script:  SET FileName ="C:\Users\Andy\Dropbox\ Setting.xml " FOR /F  "usebackq delims==" %%i IN (`dir /b /s Setting.xml `) DO COPY /Y  %FileName% "%%i"

[C#] FTP download sample code

If you'd like DL file through  WebRequestMethods, maybe you could try below sample code Input: filePath = "ftp://100.251.237.125/update.xml" targetPath  = update.xml public bool DwonlaodFileFromFTP( string filePath, string targetPath, out string errorMessage)         {             // initialize                      FtpWebRequest request = ( FtpWebRequest ) WebRequest .Create(filePath);             request.Credentials = new NetworkCredential (_user, _password);             request.Proxy = null ;             request.Method = WebRequestMethods . Ftp .DownloadFile;             request.UsePassive = false ;                         FtpWebResponse response = ( FtpWebResponse )request.GetResponse();             Stream responseStream = response.GetResponseStream();                           using ( Stream fileWriter = File .Create(targetPath))             {                 responseStream.C

[C#] FtpWebRequest failed

[C#] FtpWebRequest fails  I try to list files using FtpWebRequest but  it fails with a WebException 'The underlying connection was closed: An unexpected error occurred on a receive.'             string ftpPath = "ftp://" + this ._ip;                          FtpWebRequest request = ( FtpWebRequest ) WebRequest .Create(ftpPath);             request.Credentials = new NetworkCredential (_user, _password);             request.Proxy = null ;             request.Method = WebRequestMethods . Ftp .ListDirectory;              FtpWebResponse response = ( FtpWebResponse )request.GetResponse();              Stream responseStream = response.GetResponseStream();     >> Exception!!! After trial and error, I found I need to set  Active Mode  for connection (default Passive property is  false)             string ftpPath = "ftp://" + this ._ip;             FtpWebRequest request = ( FtpWebRequest ) WebReques

[WPF]如何在程式中加入Hot key event

假設今天我想要讓使用者Hot key(如Alt) trigger程式做事情的時候 我們可以編寫UI的xaml 加入   PreviewKeyDown  事件的handler 並實作他 Step 1. Add event handler < Window         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"         xmlns : d ="http://schemas.microsoft.com/expression/blend/2008"         xmlns : mc ="http://schemas.openxmlformats.org/markup-compatibility/2006" mc : Ignorable ="d"         xmlns : conv ="clr-namespace:Solution.Converter"         x : Class ="Solution.MainWindow"          WindowState ="Maximized" WindowStyle ="None"         SnapsToDevicePixels ="True"         d : DesignWidth ="800" d : DesignHeight ="600"         Loaded ="Window_Loaded"         PreviewKeyDown ="Window_PreviewKeyDown" Step 2. Implement event handle

[MFC] 進入桌面後自動執行程式

如果想要在進入桌面時 讓程式自動起來執行 基本上有兩種方法 1. 透過 Windows Task  scheduler 把程式叫起來 2. 在指定的 registry 路徑下註冊想要執行程式(這也本篇文章想要分享給各位的) 假設今天我想要每次進入桌面時,OS都會自動把APP.exe 叫起來執行的話 其實程式在安裝時可以在 registry的特定路徑Run底下寫入APP資訊如下   CRegKey keyReg;               CString strkey;      strkey.Format(_T( "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" ));   if (keyReg.SetStringValue(_T( "APP_EXE_RUN" ), _T( "C:\\APP.exe" )) != ERROR_SUCCESS)                 {                    //fail                                      }    keyReg.Close();

[C#] 如何偵測程式執行環境是否在WINPE

WINPE 簡單來說就是一個小型的OS 可以放在USB裡開機, 不須特別安裝 所以對於IT人員來說是非常方便的工具用來部屬系統 一般而言, WINPE 裡會提供專屬的工具讓我們呼叫 例如: WINPEUTIL Reboot 若程式執行的環境會在Destop 以及 WINPE底下時 則必須明確地知道自己的環境才不會使用錯的工具 以下是C# sample code 用來偵測是不是WINPE 環境 string strREG = @" SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinPE " ; RegistryKey regKey = Registry . LocalMachine . OpenSubKey ( strREG , true ) ; if ( regKey ! = null ) { // It's WINPE

[MFC] 使用Timer更新UI上的資訊

宣告 timer 資源 #define IDC_Timer   2948 宣告訊息映射函數 BEGIN_MESSAGE_MAP( WaitProceDlg , CDialog) ON_WM_TIMER() END_MESSAGE_MAP() 實作回呼函式 onTimer void WaitProceDlg::OnTimer(UINT_PTR nIDEvent) {          // TODO: Add your message handler code here and/or call default                 CDialog::OnTimer(nIDEvent); } 啟動 timer SetTimer(IDC_Timer,500,NULL);

[MFC] 修改字體大小(font size)

假設客戶的需求是希望UI的字體大小能在 runtime 時決定, 此時我們有兩種方式來修改font size: (這裡使用TextControl IDC_STATIC_1) 為例子 Way 1. 取得UI上的控件, 並呼叫SetFont() CFont m_font; / /設定大小為 4 m_ font.CreatePointFont (40 , L"Arial" ); //取得UI上的控件, 並呼叫SetFont() GetDlgItem ( IDC_STATIC_1 )->SetFont(m_font); Way 2. 透過 息映射(message mapping)函數  ON_WM_CTLCOLOR    Step 1.宣告訊息映射(message mapping)函數   BEGIN_MESSAGE_MAP(CTestDlg, CDialog)          ...           ON_WM_CTLCOLOR( )          ...      END_MESSAGE_MAP() Step 2. 實作回呼函式  OnCtlColor HBRUSH CTestDlg :: OnCtlColor ( CDC *  pDC, CWnd *  pWnd, UINT nCtlColor ) {         HBRUSH hbr  =  CDialog :: OnCtlColor (  pDC, pWnd, nCtlColor  ) ;          if ( pWnd - > GetDlgCtrlID ( )   ==   IDC_STATIC_1 )  //取得UI上的控件          {                                 pDC - > SetBkMode ( TRANSPARENT ) ;                 CFont font ;                 font. CreatePointFont ( 40 , L "Arial" ) ;  / /大小為 4                 pDC -

[WPF] UI can't drag or move

由於 Window 設定  WindowStyle ="None" 因此會使UI變成不能拖拉的狀況 解決方法是註冊 MouseDown 的event handle 如下: < Window x : Class ="APPUI.MainWindow"         xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"              Title ="MainWindow" Height ="540" Width ="764" ResizeMode ="NoResize"         WindowStyle ="None"         MouseDown ="Window_MouseDown_1"         > ... 並且實作  Window_MouseDown_1 private void Window_MouseDown_1( object sender, MouseButtonEventArgs e)         {             if (e.ChangedButton == MouseButton .Left)                 this .DragMove();         }

[C#] 避免系統進入休眠狀態

Prevent system from going to sleep or hibernate 不知道大家有沒有遇過這種問題 由於程式執行的時間可能需要花費大量時間 又執行的環境沒有disable休眠的服務 因此程式執行到一半時系統常常會進入休眠狀態 而造成程式無法作完 為了避免這種狀況發生 可以在程式執行的開頭先暫時關閉系統的休眠功能 直到最後在把休眠功能開啟         [   DllImport (   "kernel32.dll" )]           private   static   extern   uint   SetThreadExecutionState(   uint   esFlags);           private   const   uint   ES_CONTINUOUS = 0x80000000;           private   const   uint   ES_SYSTEM_REQUIRED = 0x00000001;           private   const   uint   ES_DISPLAY_REQUIRED = 0x00000002;         int Main(){                            //Disable S3\S4          SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED );          // Do something                    //Enable S3\S4          SetThreadExecutionState(ES_CONTINUOUS);         }

[WPF] 如何在程式UI秀出來之前先作一些事情

如何在程式UI秀出來之前先作一些事情 首先我們必須知道 App.xaml 可以用來決定程式的起始點(starting point) 如下: <Application   x:Class = "WpfTutorialSamples.App"               xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"               xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"                StartupUri = "MainWindow.xaml" > 預設 StartupUri="MainWindow.xaml" 因此程式一開始會直接秀出 MainWindow 但是有時候我們會想在MainWindow出來前先做一些事情 此時我們就必須選用Startup的屬性來開始程式 並註冊Startup event 的event handle 讓程式起來的時候會先處理我們指定的事情 如下: Step 1. 實作Startup event的event handle   public   partial   class   App   :   Application           {                   private   void   Application_Startup ( object  sender ,   StartupEventArgs  e )                   {                           // Create the startup window                           MainWindow  wnd  =   new   MainWindow ();                              // Show the window                    

[C#] 使用BackgroudWorker 取得執行結果

當我們的程式在處理極為耗時的運算時,為了不要讓UI停在那邊等待運算結果 可以使用thread , BackgroundWorker 來分擔UI thread 的工作量 一般來說首先需要註冊DoWork事件的event handle ...        _BackgroundWorker.DoWork += backgroundWorker_StartToWork; ...         private void backgroundWorker_StartToWork( object sender, DoWorkEventArgs e){             //statement        } 但若想要輸出執行結果的話 可以在DoWork事件的 event handle 裡( backgroundWorker_StartToWork )更新 e.Result的值,並註冊  RunWorkerCompleted  事件的 envent handle, 再藉由它 取得 e.Result          private void backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)        {              //statement        }

[WPF][Error] Must create DependencySource on same Thread as the DependencyObject

今天使用程式產生了一張BitmapImage的圖片 當要將圖片assign 給Form 的成員變數時卻遇到下面的錯誤訊息 Exception: Must create DependencySource on same Thread as the DependencyObject. 由於圖片是透過 worker thread  產生的, 上網爬文後才知道這麼做其實很危險 最保險的方法還是從   resource    裡把圖片load 進來 另一個解法: BitmapImage  有一個 function   Freezable()    ,我們可以藉由呼叫它將圖片變成 read-only 的狀態,  一旦圖片的屬性是read-only , 就可以放心的在其他執行緒中使用了