2011年1月31日 星期一

簡單的自動登入網頁 in C#

公司裡面使用網路需要登入認證網頁作認證。但是我不想每天都要輸入認證密碼,想要電腦自動去認證。在C#中,做到這樣的事其實很簡單。使用WebBrowser類別就可以達到模擬登入的效果了。

首先我們看網頁長怎樣。下圖是一個很典型的登入畫面
image

首先要知道網址在哪裡。將WebBrowser指向這個網址。

webBrowser1.Navigate(http://10.10.10.1/);

待網頁讀取完後,就在WebBrowserDocumentCompleted事件裡面去讀取網頁的內容。在這裡需要一點html的知識。先確認Username、Password跟Login元件的name。你應該可以找到類似這樣的html。

<p><label for="login">Username</label><br/>
<input id="user_login" name="username" size="30" type="text" /><br/></p>
<p><label for="password">Password</label><br/>
<input id="user_password" name="password" size="30" type="password" /></p>
<p><input class="button" name="commit" type="submit" value="Log in" /></p>

有了name就好辦了。

在WebBrowser裡面,可以針對name把該元件提取出來,並作一些動作。我們可以把要登入的資料寫進裡面。

HtmlElement username = webBrowser1.Document.All["username"];
username.InnerText = "David";

HtmlElement password = webBrowser1.Document.All["password"];
password.InnerText = "@#Fae@r";

接著模擬按下按鈕的行為。
HtmlElement commit = webBrowser1.Document.All["commit"];
commit.InvokeMember("click");

執行一次,試試看可不可以動吧~。使用WebBrowser好處是可以幫你處理掉一些安全認證問題,如果用socket方式寫的話,遇到SSL就頭大了。其他工具的話,AutoIt也可以達到類似的效果。

參考資料:
[1] Automated Web button click in WebBrowser control

2011年1月30日 星期日

Painting Your Own Tabs - Second Edition in C#

C#裡面,GUI預設的TabControl組件只提供少少的樣式可以選擇。如果想要有Chrome或是IE8樣子的TabControl,就必須自己覆寫TabControl。由於覆寫太麻煩了,在Code Project上剛好有人提供了這些現成的方式。

http://www.codeproject.com/KB/tabs/NewCustomTabControl.aspx

套用起來就可以像下面這樣。當然X按鈕也是它內建的。
image

建議下載DLL檔案並且把它放在References。並在自己設計GUI的ToolBox中加入這個組件。

不過我在使用拖拉GUI上遇到了困難。只要畫面上一擺放它的TabControl,整個畫面就會變得很不正常,甚至設計GUI的畫面不能使用。在執行作者提供的DEMO project也是會有這種情況發生。

後來沒有找到解法,只有迂迴的方法,那就是不要在自己的ToolBox上新增。一切用手工打造程式碼。

this.tabControl1 = new CustomTabControl();
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(708, 377);
this.tabControl1.DisplayStyle = System.Windows.Forms.TabStyle.Chrome;
this.tabControl1.DisplayStyleProvider.ShowTabCloser = true;
this.tabControl1.TabIndex = 0;

this.panel2.Controls.Add(this.tabControl1);

自己手動加入panel2中。這樣設計GUI的畫面就不會爛掉了。

2011年1月16日 星期日

偵測.Net版本程式

.NET Version Detector X提供存在電腦中各.Net版本的偵測。貼心的是,還有提供下載網址供安裝。

詳細:http://www.asoft.be/prod_netver.html

image

2011年1月4日 星期二

System tray program in C#

C#創建一個含有system程式是非常簡單的。步驟如下。

1. 建立一個windows form程式。

2. 從Toolbox上拖曳一個Notify Icon到windows form上。由於Notify Icon沒有實體,所以就會落在下方的灰色地帶。
image

3. 調整Notify Icon的Text屬性,還有顯示的icon。注意,如果沒有設定icon的形況下,執行時在system tray是不會出現icon的。

4. 接著想要在system tray上按右鍵出現表單,從ToolBox上拖曳ContextMenuStrip到windows form上。ContextMenustrip上就自己新增選項跟事件。
image

5. 回到剛剛的Notify Icon,在Context Menu上加入剛剛的ContextMenuStrip。
image

6. 最後的樣子應該會長這樣。編譯後就會出現了。
image

如果你想要讓你的主視窗按下X後自動隱藏,你可以使用下面程式碼。

private void Form1_Resize(object sender, System.EventArgs e){
   if (FormWindowState.Minimized == WindowState)
      Hide();
}

若要顯示,可以使用Show()這個方法。

如果你的主視窗是用Application啟動,那麼Hide()可能會失效。你可以改用

this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Minimized;

使用下面的程式碼就可以讓視窗回復

this.ShowInTaskbar = true;
this.WindowState = FormWindowState.Normal;

參考資料:
[1] C# Tip: Placing Your C# Application in the System Tray