程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC編寫簡單的序列號(SN)填寫器

VC編寫簡單的序列號(SN)填寫器

編輯:vc教程

  前幾天在網上看到有個軟件叫SNCopy,用來輔助填寫系列號(SN)的。創意覺得還是挺好的。裝軟件的時候經常要填寫系列號,而很多系列號都要分節來填寫,沒法用Ctrl+C和Ctrl+V(復制和粘貼)來一次性搞定,只能分節的復制和粘貼,很是麻煩。SNCopy就是來幫我們解決這個問題的。感覺這個不是很難做,就是從剪貼板上獲取整個系列號,然後進行分解,依次填入即可。於是動手自己也做一個!

  一、建立一個基於對話框的應用程序 Snpaste(過程略)

  二、編寫代碼

  我們使用Shift+V作為快捷鍵,以此來快速地一次性地填寫整個系列號。先進行熱鍵的注冊。在InitDialog()中添加如下代碼:

if(!::RegisterHotKey(this->GetSafeHwnd(),0x3333,MOD_SHIFT,0x56))
{
 ::AfxMessageBox("熱鍵注冊失敗!");
 this->CloseWindow();
}

  在程序退出前必須注銷熱鍵。在OnClose()中:

::UnregisterHotKey(this->GetSafeHwnd(),0x3333); 

  響應熱鍵:

LRESULT CsnpasteDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
 if(!OpenClipboard())
 {
  ::AfxMessageBox("無法打開粘貼板!");
  return -1;
 }
 CString str=CString((char*)::GetClipboardData(CF_TEXT));
 CString oldstr=str;//保存原來的字串
 CloseClipboard();
 str.Trim();
 CString strtemp;
 int find_i=str.Find(''-'');
 if(find_i!=-1)//系列號中有“-”的,以此來劃分系列號字串
 {
  while(find_i!=-1)
  {
   strtemp=str.Left(find_i);
   str=str.Mid(find_i+1);
   find_i=str.Find(''-'');
   Sleep(100);//由於剪貼板操作比較慢,必須加一定的延時,否則數據會出錯。
   this->SendStrToClipboard(strtemp);//將分解得到的一小節字串復制到剪貼板
   this->PerformCtrlV();//模仿鍵盤擊鍵Ctrl+V
   this->PerformClickTab();//模仿鍵盤擊鍵Tab
  }
  if(!str.IsEmpty())
  {
   this->SendStrToClipboard(str);
   this->PerformCtrlV();
   this->PerformClickTab();
  }
 }
 else//系列號字串中沒有“-”,有預先設定的長度來劃分。
 { 
  while(!str.IsEmpty())
  {
   strtemp=str.Left(this->m_spinctrl.GetPos());
   str=str.Mid(this->m_spinctrl.GetPos());
   Sleep(100);
   this->SendStrToClipboard(strtemp);
   this->PerformCtrlV();
   this->PerformClickTab();
  }
 }
 Sleep(100);
 this->SendStrToClipboard(oldstr);//恢復原來剪貼板上的數據
 return 1;
}

  以下是鍵盤擊鍵動作的模仿

void CsnpasteDlg::PerformCtrlV(void)
{
 ::keybd_event(VK_CONTROL,0,0,0);//按Ctrl,不放開
 ::keybd_event(0x56,0,0,0);//V key;再按V鍵不放開
 ::keybd_event(0x56,0,KEYEVENTF_KEYUP,0);//放開V鍵
 ::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);//放開Ctrl鍵
}
void CsnpasteDlg::PerformClickTab(void)
{
 ::keybd_event(VK_TAB,0,0,0);//按Tab鍵不放
 ::keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);//放開Tab鍵

  以下是把字串送到剪貼板

void CsnpasteDlg::SendStrToClipboard(CString str)
{
 if(!OpenClipboard())
 {
  ::AfxMessageBox("無法打開粘貼板!");
  return ;
 }
 EmptyClipboard();//清空
 HGLOBAL hglo;
 hglo=GlobalAlloc(GPTR,str.GetLength()+1);//申請全局空間
 if(hglo==NULL)
 {
  ::AfxMessageBox("申請內存失敗!");
  return ;
 }
 LPBYTE pbyte=(LPBYTE)GlobalLock(hglo);
 memcpy(pbyte,str.GetBuffer(),str.GetLength());
 str.ReleaseBuffer();
 GlobalUnlock(hglo);
 SetClipboardData(CF_TEXT,hglo);//將數據送到剪貼板
 CloseClipboard();

  三、程序運行

  程序在visual c++7.1上編譯通過。界面如下:

  只要將所要填寫的系列號復制到剪貼板上,然後將光標放置在所要填寫的位置,作用Shift+V就可以輕松一次性把系列號填寫完。好的創意往往是成功的一半!

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved