<!--
body { font-family: "宋体"; font-size: 9pt;color: #000000 }
.u0 { font-family: "宋体"; font-size: 9pt;color: #FF0000 }
.u1 { font-family: "宋体"; font-size: 9pt;color: #008000 }
.u2 { font-family: "宋体"; font-size: 9pt;color: #000080 }
.u3 { font-family: "宋体"; font-size: 9pt;color: #000080 }
.u4 { font-family: "宋体"; font-size: 9pt;color: #000000 }
.u5 { font-family: "宋体"; font-size: 9pt; font-weight: bold;color: #0000FF }
.u6 { font-family: "宋体"; font-size: 9pt;color: #0000FF }
.u7 { font-family: "宋体"; font-size: 9pt;color: #000000 }
.u8 { font-family: "宋体"; font-size: 9pt;color: #000080 }
.u9 { font-family: "宋体"; font-size: 9pt;color: #000000 }
.u10 { font-family: "宋体"; font-size: 9pt;color: #000080 }
-->
/////////////////////////////////////////////////////////
// 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.