熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用C#代碼編寫的SN快速輸入工具

2013-11-13 09:47:33  來源: .NET編程 

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

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

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

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

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

  於是就用到了string ClipboardGetText()這個靜態方法將剛才復制的帶的序列號取出來然後用個string類型的變量strKeys保存在我的程序中以便使用

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

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

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

  那麼我只要將原來文本strKeys中的全部轉換成{Tab}然後再交給SendKeys這個類來處理這個程序就基本完成了於是有了
strKeysReplace( {TAB});
SendKeysSend(strKeys);


  這兩行代碼

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

private void ProcessHotkey()//主處理程序
{
 strKeys = ClipboardGetText();
 strKeysReplace( {TAB});
 SendKeysSend(strKeys);
}

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

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

  要設置快捷鍵必須使用userdll下面的兩個方法

BOOL RegisterHotKey(
 HWND hWnd
 int id
 UINT fsModifiers
 UINT vk
);

  和

BOOL UnregisterHotKey(
 HWND hWnd
 int id
);


  轉換成C#代碼那麼首先就要引用命名空間SystemRuntimeInteropServices;來加載非托管類userdll於是有了

[DllImport(userdll SetLastError=true)]
public static extern bool RegisterHotKey(
 IntPtr hWnd // handle to window
 int id // hot key identifier
 KeyModifiers fsModifiers // keymodifier options
 Keys vk // virtualkey code
);

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


[Flags()]
public enum KeyModifiers
{
 None =
 Alt =
 Control =
 Shift =
 Windows =
}


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

  於是有了

private void Form_Load(object sender SystemEventArgs e)
{
 labelAutoSize = true;

 ClipboardClear();//先清空剪貼板防止剪貼板裡面先復制了其他內容
 RegisterHotKey(Handle KeysF);
}

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


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

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

protected override void WndProc(ref Message m)//監視Windows消息
{
 const int WM_HOTKEY = x;//按快捷鍵
 switch (mMsg)
 {
  case WM_HOTKEY:
   ProcessHotkey();//調用主處理程序
   break;
 }
 baseWndProc(ref m);
}


  這樣我的程序就完成了

 全部代碼

using System;
using SystemDrawing;
using SystemCollections;
using SystemComponentModel;
using SystemWindowsForms;
using SystemData;
using SystemRuntimeInteropServices;

namespace WindowsApplication
{
 ///
 /// Form 的摘要說明
 ///

 public class Form : SystemWindowsFormsForm
 {
  ///
  /// 必需的設計器變量
  ///

  private SystemComponentModelContainer components = null;

  public Form()
  {
   //
   // Windows 窗體設計器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 調用後添加任何構造函數代碼
   //
  }

  ///
  /// 清理所有正在使用的資源
  ///

  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     componentsDispose();
    }
   }
   baseDispose( disposing );
  }

  #region Windows 窗體設計器生成的代碼
  ///
  /// 設計器支持所需的方法 不要使用代碼編輯器修改
  /// 此方法的內容
  ///

  private void InitializeComponent()
  {
   thislabel = new SystemWindowsFormsLabel();
   thislabel = new SystemWindowsFormsLabel();
   thislabel = new SystemWindowsFormsLabel();
   thislabel = new SystemWindowsFormsLabel();
   thislabel = new SystemWindowsFormsLabel();
   thisSuspendLayout();
   //
   // label
   //
   thislabelAutoSize = true;
   thislabelLocation = new SystemDrawingPoint( );
   thislabelName = label;
   thislabelSize = new SystemDrawingSize( );
   thislabelTabIndex = ;
   thislabelText = EoStion制作;
   //
   // label
   //
   thislabelAutoSize = true;
   thislabelLocation = new SystemDrawingPoint( );
   thislabelName = label;
   thislabelSize = new SystemDrawingSize( );
   thislabelTabIndex = ;
   thislabelText = 使用方法;
   //
   // label
   //
   thislabelAutoSize = true;
   thislabelLocation = new SystemDrawingPoint( );
   thislabelName = label;
   thislabelSize = new SystemDrawingSize( );
   thislabelTabIndex = ;
   thislabelText = 將序列號拷貝到剪切板;
   //
   // label
   //
   thislabelAutoSize = true;
   thislabelLocation = new SystemDrawingPoint( );
   thislabelName = label;
   thislabelSize = new SystemDrawingSize( );
   thislabelTabIndex = ;
   thislabelText = 將光標定位到序列號輸入處;
   //
   // label
   //
   thislabelAutoSize = true;
   thislabelLocation = new SystemDrawingPoint( );
   thislabelName = label;
   thislabelSize = new SystemDrawingSize( );
   thislabelTabIndex = ;
   thislabelText = 按F;
   //
   // Form
   //
   thisAutoScaleBaseSize = new SystemDrawingSize( );
   thisClientSize = new SystemDrawingSize( );
   thisControlsAdd(thislabel);
   thisControlsAdd(thislabel);
   thisControlsAdd(thislabel);
   thisControlsAdd(thislabel);
   thisControlsAdd(thislabel);
   thisName = Form;
   thisText = SN輸入工具(C#版Version);
   thisFormClosing += new SystemWindowsFormsFormClosingEventHandler(thisForm_FormClosing);
   thisLoad += new SystemEventHandler(thisForm_Load);
   thisResumeLayout(false);
   thisPerformLayout();
  }
  #endregion

  ///
  /// 應用程序的主入口點
  ///

  [STAThread]
  static void Main()
  {
   ApplicationRun(new Form());
  }

  [DllImport(userdll SetLastError=true)]
  public static extern bool RegisterHotKey( IntPtr hWnd
   // handle to window
   int id // hot key identifier
   KeyModifiers fsModifiers // keymodifier options
   Keys vk // virtualkey code
  );

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

  [Flags()]
  public enum KeyModifiers
  {
   None =
   Alt =
   Control =
   Shift =
   Windows =
  }

  private void ProcessHotkey()//主處理程序
  {
   strKeys = ClipboardGetText();
   strKeysReplace( {TAB});
   SendKeysSend(strKeys);
  }

  private Label label;
  private Label label;
  private Label label;
  private Label label;
  private Label label;

  string strKeys;

  private void Form_Load(object sender SystemEventArgs e)
  {
   labelAutoSize = true;

   ClipboardClear();//先清空剪貼板防止剪貼板裡面先復制了其他內容
   RegisterHotKey(Handle KeysF);
  }

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

  protected override void WndProc(ref Message m)//循環監視Windows消息
  {
   const int WM_HOTKEY = x;//按快捷鍵
   switch (mMsg)
   {
    case WM_HOTKEY:
     ProcessHotkey();//調用主處理程序
     break;
   }
   baseWndProc(ref m);
  }
 }
}


From:http://tw.wingwit.com/Article/program/net/201311/11597.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.