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

自制系列號(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