国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現的SN快速輸入工具實例

2020-01-24 02:16:45
字體:
來源:轉載
供稿:網友

本文實例講述了C#實現的SN快速輸入工具的方法。分享給大家供大家參考。具體實現方法分析如下:

一般軟件都要輸入序列號(SN),而大家平時用的最多的恐怕是盜版軟件,通常盜版軟件的序列號(SN)都保存成:XXXXX-XXXXX-XXXX-XXXX的形式。

而軟件輸入序列號的地方通常都是幾個文本框(TextBox)組成。一個個的將XXXXX復制到文本框將非常麻煩。于是SN快速輸入工具便由此產生了。

當然這些都和我的編寫這個程序的原因無關。我編寫這個程序的原因純粹是因為有個網友和他舅舅打賭說要編寫個程序,而他舅舅就是要他編寫這個程序,但可惜我的這位網友才是個編程初學者(比我更菜的菜鳥),當然完成不了這個看似簡單,實際要用到許多編程知識的程序咯。

要做這個程序,首先當然是要了解程序的功能了。它的功能就是要讓你復制完了形式如“XXXXX-XXXXX-XXXX-XXXX”的序列號之后,當你把鼠標指向文本框,程序能自動將XXXXX添加到相應的文本框中。

既然是要處理復制的序列號,那么我們肯定要用到和剪貼板相關的東西了。剪貼板,還好這個我以前在C#中用過N次了,不用再查windows api了。C#里面本來就提供了Clipboard這個類。

于是就用到了string Clipboard.GetText()這個靜態方法,將剛才復制的帶-的序列號取出來,然后用個string類型的變量strKeys保存在我的程序中,以便使用。

第一步,從剪貼板里面取數據,我們就完成了。

接著,我們該考慮怎么處理我們的數據了,我們的數據最后是要寫到幾個連續的文本框中的,那么我們可以考慮通過String.Split(char[],string splitoption)這個方法將序列號分割成幾個子字符串,然后再通過windows api講文本輸出到相應的textbox句柄上。但是這樣做無疑增加了程序的難度,幾個連續的文本框的切換,使用Tab鍵就能做到了,然后將文本輸出到文本框中,直接讓鍵盤打出來就ok了。那么很明顯,我們只需要將我們要按的鍵模擬出來就行了,這個時候我首先想到的是windows api中鍵盤模擬事件keybd_event,于是我開始在MSDN中查詢keybd_event方法,方法中有個KEYEVENTF_KEYUP這個參數,但是我不知道他相應的值,于是我開始查找這個長整形的值。但是始終都找不到,就在我在MSDN中查找KEYUP相關的東西的時候,我突然發現了System.Windows.Form.SendKeys這個類。原來.net framework已經將keybd_event這個非托管對象的方法封裝到SendKeys這個類中了,直接使用SendKeys這個類就可以模擬鍵盤操作了。

再查詢Tab鍵的寫法就是{Tab}。

那么我只要將原來文本strKeys中的-全部轉換成{Tab}然后再交給SendKeys這個類來處理,這個程序就基本完成了。

于是有了

復制代碼 代碼如下:
strKeys.Replace("-", "{TAB}");
SendKeys.Send(strKeys);

這兩行代碼。

這樣就有了我的程序的主過程:

復制代碼 代碼如下:
private void ProcessHotkey()//主處理程序
{
 strKeys = Clipboard.GetText();
 strKeys.Replace("-", "{TAB}");
 SendKeys.Send(strKeys);
}

但是我們怎么通過快捷鍵來觸發,來完成這個過程了。

于是我開始在百度和MSDN查找相關處理全局快捷鍵的windows api的資料。

要設置快捷鍵必須使用user32.dll下面的兩個方法。

復制代碼 代碼如下:
BOOL RegisterHotKey(
 HWND hWnd,
 int id,
 UINT fsModifiers,
 UINT vk
);


復制代碼 代碼如下:
BOOL UnregisterHotKey(
 HWND hWnd,
 int id
);

轉換成C#代碼,那么首先就要引用命名空間System.Runtime.InteropServices;來加載非托管類user32.dll。于是有了:

復制代碼 代碼如下:
[DllImport("user32.dll", SetLastError=true)]
public static extern bool RegisterHotKey(
 IntPtr hWnd, // handle to window
 int id, // hot key identifier
 KeyModifiers fsModifiers, // key-modifier options
 Keys vk // virtual-key code
);

[DllImport("user32.dll", SetLastError=true)]
public static extern bool UnregisterHotKey(
 IntPtr hWnd, // handle to window
 int id // hot key identifier
);

[Flags()]
public enum KeyModifiers
{
 None = 0,
 Alt = 1,
 Control = 2,
 Shift = 4,
 Windows = 8
}

這是注冊和卸載全局快捷鍵的方法,那么我們只需要在Form_Load的時候加上注冊快捷鍵的語句,在FormClosing的時候卸載全局快捷鍵。同時,為了保證剪貼板的內容不受到其他程序調用剪貼板的干擾,在Form_Load的時候,我先將剪貼板里面的內容清空。

于是有了:

復制代碼 代碼如下:
private void Form1_Load(object sender, System.EventArgs e)
{
 label2.AutoSize = true;

 Clipboard.Clear();//先清空剪貼板防止剪貼板里面先復制了其他內容
 RegisterHotKey(Handle, 100, 0, Keys.F10);
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
 UnregisterHotKey(Handle, 100);//卸載快捷鍵
}

那么我們在別的窗口,怎么讓按了快捷鍵以后調用我的主過程ProcessHotkey()呢?

那么我們就必須重寫WndProc()方法,通過監視系統消息,來調用過程:

復制代碼 代碼如下:
protected override void WndProc(ref Message m)//監視Windows消息
{
 const int WM_HOTKEY = 0x0312;//按快捷鍵
 switch (m.Msg)
 {
  case WM_HOTKEY:
   ProcessHotkey();//調用主處理程序
   break;
 }
 base.WndProc(ref m);
}

至此我們的程序就完成了。

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北票市| 宁陕县| 酉阳| 亳州市| 城固县| 乌恰县| 普宁市| 汉沽区| 榆树市| 江山市| 安溪县| 富锦市| 通河县| 商丘市| 岳池县| 密云县| 漾濞| 华宁县| 云安县| 邵武市| 灵台县| 贺州市| 开封市| 杭锦旗| 隆昌县| 通化市| 云阳县| 武邑县| 苗栗县| 阆中市| 湟源县| 手机| 北海市| 芮城县| 遂川县| 宜州市| 齐河县| 陆良县| 新田县| 蕲春县| 池州市|