【 tulaoshi.com - 编程语言 】
                             
                            ///////////////////////////////////////////////////////// 
  //        SnInput                                      // 
  //                                                     // 
  //                            作者:黄展宏              // 
  //                            QQ号:309654973           // 
  //                            创建于:2005/06/23        // 
  //                            修改于:2005/06/29        // 
  /////////////////////////////////////////////////////////     
  program SnInput;   
  {$APPTYPE GUI} 
  {$I-}   
  uses 
    Windows, 
    Messages, 
    SysUtils;   
  var 
    atom: Integer = 0; 
    hInst: Integer; 
    wc: TWndClassEx; 
    Msg: TMsg;   
    hFont: Integer = 0; 
    hMutex: Integer;   
    hWnd: Integer; 
    hEdit: Integer; 
    hCheckBox: Integer; 
    hTmpWnd: Integer;   
  const 
    ID_CHECKBOX = 100; 
    STR_INTERNALNAME = 'SnInputApplication'; 
    STR_CHECKBOX = '将“-”(杠号)转为跳格键(Tab)。'; 
    STR_HOTKEY = 'MyHotKey_OrochiHuang_2005.6.18'; 
    STR_PRODUCT = '序列号输入助手 V0.1'; 
    STR_TIPS = (#13#10 + 
      '使用说明:' + #13#10 + 
      '1、复制序列号。'#13#10 + 
      '2、将光标定位到序列号输入处。'#13#10 + 
      '3、按F10键。'#13#10 + #13#10 + 
      '“将‘-’(杠号)转为跳格键(Tab)”功能说明:' + #13#10 + 
      '  因为有一些程序当输完一段序列号后,不会自动跳往下一格继续输入,导致把全部注册码输入在一个序列号段里,' + 
      '遇到这个种情况的话勾选它就对啦!' + #13#10 + #13#10 + 
      '作者:黄展宏' + #13#10 + 
      'Email:orochi_huang@126.com');     
  procedure MySendKeys(Keys: PChar); 
    procedure SendKeyDown(VKey: Byte); 
    var ScanCode: Byte; 
    begin 
      ScanCode := Lo(MapVirtualKey(VKey, 0)); 
      keybd_event(VKey, ScanCode, 0, 0); 
    end;   
    procedure SendKeyUp(VKey: Byte); 
    var ScanCode: Byte; 
    begin 
      ScanCode := Lo(MapVirtualKey(VKey, 0)); 
      keybd_event(VKey, ScanCode, KEYEVENTF_KEYUP, 0); 
    end;   
    function BitSet(BitTable, BitMask: Byte): Boolean; 
    begin 
      Result := ByteBool(BitTable and BitMask); 
    end;   
  var 
    L: Word; 
    I: Word; 
    MKey: Word; 
    ScanCode: Byte; 
  const 
    VKKEYSCANSHIFTON = $01; 
    VKKEYSCANCTRLON = $02; 
    VKKEYSCANALTON = $04; 
  begin 
    L := StrLen(Keys);   
    if L = 0 then Exit;   
    for I := 0 to L - 1 do 
    begin 
      MKey := vkKeyScan(Keys[I]); 
      if MKey  $FFFF then 
      begin 
        ScanCode := Hi(MKey); 
        if BitSet(ScanCode, VKKEYSCANSHIFTON) then SendKeyDown(VK_SHIFT); 
        if BitSet(ScanCode, VKKEYSCANCTRLON) then SendKeyDown(VK_CONTROL); 
        if BitSet(ScanCode, VKKEYSCANALTON) then SendKeyDown(VK_MENU); 
        SendKeyDown(MKey); 
        SendKeyUp(MKey); 
        if BitSet(ScanCode, VKKEYSCANSHIFTON) then SendKeyUp(VK_SHIFT); 
        if BitSet(ScanCode, VKKEYSCANCTRLON) then SendKeyUp(VK_CONTROL); 
        if BitSet(ScanCode, VKKEYSCANALTON) then SendKeyUp(VK_MENU); 
        Sleep(15);  
      end; 
    end;   
  end;   
  procedure HotKey(hWnd: Integer; state: Boolean); 
  begin   
    if state then 
    begin 
      atom := GlobalFindATOM(STR_HOTKEY);   
      if atom = 0 then atom := GlobalAddATOM(STR_HOTKEY);   
      RegisterHotKey(hWnd, atom, 0, VK_F10); 
    end 
    else begin 
      if atom  0 then 
      begin 
        UnregisterHotKey(hWnd, atom); 
        GlobalDeleteATOM(atom); 
        atom := 0; 
      end; 
    end; 
  end;   
  function WndProc(hWnd: Integer; uMsg: Cardinal; 
    wParam, lParam: Integer): LRESULT; stdcall; 
  var 
    hData: Integer; 
    Keystr: string; 
    Position: Byte; 
    rc: TRect;   
  begin 
    Result := 0; 
    case uMsg of 
      WM_CTLCOLORSTATIC: 
        begin 
          if lParam = hEdit then 
          begin 
            SetBkColor(wParam, $FFFFFF); 
            Result := GetStockObject(WHITE_BRUSH); 
          end; 
        end;   
      WM_CREATE: 
        begin 
          HotKey(hWnd, True); 
          GetClientRect(hWnd, rc); 
          hEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', STR_TIPS, 
            WS_BORDER or WS_CHILD or WS_VISIBLE or ES_READONLY or ES_MULTILINE or 
            WS_VSCROLL, 
            0, 30, rc.Right, rc.Bottom - 30, hWnd, 0, hInst, nil);   
          hCheckBox := CreateWindowEx(0, 'BUTTON', STR_CHECKBOX, WS_VISIBLE or 
            WS_CHILD or BS_AUTOCHECKBOX, 
            10, 10, 300, 20, hWnd, ID_CHECKBOX, hInst, nil);   
          hFont := CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 
            DEFAULT_CHARSET, 0, 0, 0, 0, '宋体');   
          if hFont  0 then 
          begin 
            SendMessage(hEdit, WM_SETFONT, hFont, 0); 
            SendMessage(hCheckBox, WM_SETFONT, hFont, 0); 
          end;   
        end;   
      WM_HOTKEY: 
        begin 
          OpenClipboard(hWnd); 
          hData := GetClipboardData(CF_TEXT);   
          if hData  0 then 
          begin 
            Keystr := StrPas(PChar(GlobalLock(hData))); 
            Position := Pos('-', Keystr);   
            while Position  0 do 
            begin              
              if SendMessage(hCheckBox, BM_GETCHECK, 0, 0)  0 then 
                Keystr[Position] := Char(VK_TAB) 
              else 
                Delete(KeyStr, Position, sizeof(keystr[Position]));   
              Position := Pos('-', Keystr); 
            end;   
            MySendKeys(PChar(KeyStr)); 
            GlobalUnlock(hData); 
          end; 
          CloseClipboard;   
        end;   
      WM_DESTROY: 
        begin 
          if hFont  0 then 
            DeleteObject(hFont);   
          HotKey(hWnd, False); 
          PostQuitMessage(0); 
        end;   
    else 
      Result := DefWindowProc(hWnd, uMsg, wParam, lParam); 
    end;     
  end;     
  begin 
    hMutex := CreateMutex(nil, True, STR_PRODUCT);   
    if GetLastError = ERROR_ALREADY_EXISTS then 
    begin 
      hTmpWnd := FindWindow(STR_INTERNALNAME, nil); 
      if hTmpWnd  0 then 
      begin 
        if IsIconIc(hTmpWnd) then 
          ShowWindow(hTmpWnd, SW_NORMAL);   
        SetForegroundWindow(hTmpWnd); 
        ShowWindow(hTmpWnd, SW_SHOW); 
      end; 
      Exit; 
    end;   
    hInst := hInstance; 
    FillChar(wc, SizeOf(wc), 0);   
    with wc do 
    begin 
      cbSize := SizeOf(wc); 
      style := CS_HREDRAW or CS_VREDRAW; 
      lpfnWndProc := @WndProc; 
      hInstance := hInst; 
      hIcon := LoadIcon(0, IDI_APPLICATION); 
      hCursor := LoadCursor(0, IDC_ARROW); 
      hbrBackground := GetSysColorBrush(COLOR_BTNFACE); 
      lpszClassName := STR_INTERNALNAME; 
    end;   
    if RegisterClassEx(wc) = 0 then Exit;   
    hWnd := CreateWindowEx(0, wc.lpszClassName, STR_PRODUCT, 
      (*WS_OVERLAPPED or *)WS_MINIMIZEBOX or WS_CAPTiON or WS_SYSMENU, 
      Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 320, 250, 
      0, 0, hInst, nil);   
    if hWnd = 0 then Exit;   
    ShowWindow(hWnd, SW_SHOW); 
    UpdateWindow(hWnd);   
    repeat 
      if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then 
      begin 
        TranslateMessage(Msg); 
        DispatchMessage(Msg); 
      end 
      else begin 
        ; 
      end; 
    until Msg.message = WM_QUIT;   
    ReleaseMutex(hMutex); 
    CloseHandle(hMutex);   
  end.