program WinAPIDemo; uses Windows, Messages; {$R *.RES} var wClass: TWndClass; // Класс структуры главного окна hFont, // хэндл of Шрифта hInst, Handle, // хэндл главного окна hEncrypt, // хэндл кнопки Зашифровать hDecrypt, // хэндл кнопки Расшифровать hEdit, // хэндл главного поля hLabel, // хэндл надписи hPW: HWND; // хэндл Поля пароля Msg: TMSG; // Структура сообщения dEncrypt, dDecrypt: Pointer; procedure Resize; var RCT:TRect; begin GetWindowRect(Handle,RCT); MoveWindow(hPW,230,5,RCT.Right-RCT.Left-245,24,True); MoveWindow(hEdit,5,34,RCT.Right-RCT.Left-20,RCT.Bottom-RCT.Top-66,True); end; //отчищаем и закрываем прогу procedure ShutDown; begin DeleteObject(hFont); UnRegisterClass('Sample Class',hInst); Halt; //конец программы end; //Расшифровка procedure Decrypt; var x,i, sText,sPW: Integer; Text,PW: PChar; begin sText:=GetWindowTextLength(hEdit)+1; sPW:=GetWindowTextLength(hPW)+1; GetMem(Text,sText); GetMem(PW,sPW); GetWindowText(hEdit,Text,sText); GetWindowText(hPW,PW,sPW); x:=0; for i:=0 to sText-2 do begin Text[i]:=Chr(Ord(Text[i])-Ord(PW[x])); Inc(x); if x=(sPW-1)then x:=0; end; SetWindowText(hEdit,Text); FreeMem(Text); FreeMem(PW); end; //Зашифровка procedure Encrypt; var x,i, sText,sPW: Integer; Text,PW: PChar; begin sText:=GetWindowTextLength(hEdit)+1; sPW:=GetWindowTextLength(hPW)+1; GetMem(Text,sText); GetMem(PW,sPW); GetWindowText(hEdit,Text,sText); GetWindowText(hPW,PW,sPW); x:=0; for i:=0 to sText-2 do begin Text[i]:=Chr(Ord(Text[i])+Ord(PW[x])); Inc(x); if x=(sPW-1)then x:=0; end; SetWindowText(hEdit,Text); FreeMem(Text); //память надо отчищать... FreeMem(PW); //память надо отчищать... end; //процесс function EncryptProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall; var i: Integer; begin Result:=CallWindowProc(dEncrypt,hWnd,Msg,wParam,lParam); case Msg of //Tab меняет фокус объекта WM_KEYDOWN: if wParam=9 then SetFocus(hDecrypt); end; end; function DecryptProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall; begin Result:=CallWindowProc(dEncrypt,hWnd,Msg,wParam,lParam); case Msg of //Tab меняет фокус объекта WM_KEYDOWN: if wParam=9 then SetFocus(hEncrypt); end; end; //обработка команд function WindowProc(hWnd,Msg,wParam,lParam:Longint):Longint; stdcall; begin Result:=DefWindowProc(hWnd,Msg,wParam,lParam); case Msg of WM_SIZE: Resize; WM_COMMAND: if lParam=hEncrypt then Encrypt else if lParam=hDecrypt then Decrypt; WM_DESTROY: ShutDown; end; end; //основная программа begin hInst:=GetModuleHandle(nil); with wClass do begin Style:= CS_PARENTDC; hIcon:= LoadIcon(hInst,'MAINICON'); lpfnWndProc:= @WindowProc; hInstance:= hInst; hbrBackground:= COLOR_BTNFACE+1; lpszClassName:= 'Sample Class'; hCursor:= LoadCursor(0,IDC_ARROW); end; RegisterClass(wClass); //Основное окно Handle:=CreateWindow( 'Sample Class', //Регистрация окна 'Шифровщик WinAPIDemo', //Заголовок окна WS_OVERLAPPEDWINDOW or //Стиль окна WS_VISIBLE, // 10, // Левая сторона 10, // Вверх 400, // Длина 300, // Высота 0, 0, hInst, nil); //Кнопка Зашифровать hEncrypt:=CreateWindow( 'Button', 'Зашифровать', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT, 5,5,78,24,Handle,0,hInst,nil); //Кнопка расшифровки hDecrypt:=CreateWindow( 'Button', 'Расшифровать', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT, 85,5,85,24,Handle,0,hInst,nil); // hEdit:=CreateWindowEx( WS_EX_CLIENTEDGE, 'Edit', '', WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_WANTRETURN or ES_AUTOVSCROLL or WS_VSCROLL, 5,34,380,234,Handle,0,hInst,nil); //Поле Edit hPW:=CreateWindowEx( WS_EX_CLIENTEDGE, 'Edit', '', WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or ES_PASSWORD, 230,5,155,24,Handle,0,hInst,nil); hLabel:=CreateWindow( 'Static', 'Пароль:', WS_VISIBLE or WS_CHILD or SS_LEFT, 180,10,40,20,Handle,0,hInst,nil); //создаем шрифт и размер hFont:=CreateFont( -12, //размер 0, 0, 0, 0, 0, //наклон 0, //зачеркнут 0, DEFAULT_CHARSET, //Тип кодировки OUT_DEFAULT_PRECIS, //Точность CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif'); //Шрифт //передаем настройки контроллерам SendMessage(hEncrypt,WM_SETFONT,hFont,0); SendMessage(hDecrypt,WM_SETFONT,hFont,0); SendMessage(hEdit,WM_SETFONT,hFont,0); SendMessage(hPW,WM_SETFONT,hFont,0); SendMessage(hLabel,WM_SETFONT,hFont,0); //Подкласс кнопки Расшифровать dEncrypt:=Pointer(GetWindowLong(hEncrypt,GWL_WNDPROC)); SetWindowLong(hEncrypt,GWL_WNDPROC,Longint(@EncryptProc)); //Подкласс кнопки Зашифровать dDecrypt:=Pointer(GetWindowLong(hDecrypt,GWL_WNDPROC)); SetWindowLong(hDecrypt,GWL_WNDPROC,Longint(@DecryptProc)); //Фокус на объект SetFocus(hEncrypt); while(GetMessage(Msg,Handle,0,0))do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end.
|