Блог переезжает на новый хостинг и будет доступен по адресу http://delphiblog.ru. Все новые статьи теперь будут публиковаться только там. К существующим статьям будут добавлены исходники примеров. Оставайтесь с нами)
Читать дальше >>
Блог переезжает на новый хостинг и будет доступен по адресу http://delphiblog.ru. Все новые статьи теперь будут публиковаться только там. К существующим статьям будут добавлены исходники примеров. Оставайтесь с нами)
Автор: Ivan Shyrko на 06:07 0 коммент.
Ярлыки: Переезд
Автор: Ivan Shyrko на 02:24 0 коммент.
Ярлыки: Delphi
Автор: Ivan Shyrko на 02:13 0 коммент.
Ярлыки: Сделай сам, Delphi
Создайте в Delphi новый проект и поместите на форму PageControl1:TpageControl. Затем на этот компонент поместите ListView1:TlistView. После этого на форму поместите следующие компоненты: ToolBar1:TtoolBar, ImageList1:TimageList, OpenDialog1:TopenDialog, RadioButton1:TradioButton и RadioButton2:TradioButton. Теперь выделите PageControl1 и нажмите правую клавишу мыши. Из появившегося меню выберите пункт New Page. После этого на компоненте должна появиться новая страница. Создайте, таким образом, ещё четыре страницы и дайте каждой название (свойство Caption): 1 – Run, 2 – RunOnce, 3 – RunServices, 4 – RunServicesOnce, 5 – Win.ini. Каждая страница будет отвечать за определённый ключ реестра, либо за файл Win.ini. Теперь выделите ListView1 и, при помощи свойства Columns, создайте две колонки с названиями (свойство Caption) Имя и Путь соответственно, также для каждой колонки установите свойству Autosize значение True. После этого измените значения свойства ViewStyle на vsReport. Затем сделайте активным компонент ToolBar1 и создайте на нём четыре кнопки. Для каждой свойству ShowHint (показывать подсказку) установите значение true (истина), а в свойство Hint запишите эти самые подсказки, которые будут появляться при наведении указателя мыши на ту или иную кнопку: 1 – Добавить файл, 2 – Изменить путь, 3 – Удалить файл, 4 – Автозагрузка. На кнопки, при помощи ImageList1, можно поместить иконки (см. рисунок 1). Чтобы сделать это, выполните следующие действия: кликните двойным щелчком по компоненту ImageList1, при помощи кнопки “Add…” добавьте в компонент нужные значки (каждый значок будет помещён под своим номером), выделите компонент ToolBar1 и в свойстве Images выберите компонент ImageList1. После этого нужно в свойстве ImageIndex каждой кнопки выбрать номер понравившегося значка. Теперь приведите вашу форму к виду, подобному на форму, изображённую на рисунке 1.
На этом внешнее оформление программы завершено, а значит, пора заняться непосредственно программированием. Для начала в разделе Uses подключите два модуля: Registry (для работы с реестром) и IniFiles (для работы с Ini-файлами). После этого нужно объявить несколько глобальных переменных:
var
…
ActIndex: Integer; //индекс активной страницы
Appini: TIniFile; //для работы с Ini-файлами
key: Cardinal; //текущий ключ реестра
path: String; //путь к файлу
reg: TRegistry; //для работы с реестром
i: Integer; //используется в циклах
pathfile: String;
Value, Load, Run: TStringList; //списки файлов автозагрузки
ListItem:TListItem; //для работы с компонентом ListView1
Затем запишите процедуру, которая будет из строки извлекать пути к файлам, разделённые пробелами, и помещает их в список. Позже эта процедура будет востребована.
procedure ExtractFilenames(s: String;FileNames: String;qw: TStrings);Запишите обработку события нажатия на кнопку:
procedure TForm2.Button1Click(Sender: TObject);
var
FName: String;
begin
{преобразуем имя выбранного файла в краткий формат}
FName := sysutils.ExtractShortPathName(form1.opendialog1.filename);
{записываем в выбранную константу имя файла после пробела, также отображаем добавленный файл в окне нашей программы}
if form2.RadioButton1.Checked then
path := 'Load'
else path:='Run';
AppIni := TIniFile.Create('Win.INI');
AppIni.writeString('windows', path, appini.readstring('windows', path, '') + ' ' + FName);
AppIni.Free;
with form1.ListView1 do
begin
ListItem := Items.Add;
ListItem.Caption := path;
ListItem.SubItems.Add(FName);
end;
form2.hide;
form1.show;
end;
Теперь запишите обработку нажатия кнопки New, при помощи которой можно добавить новый файл в автозагрузку:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
{если выбран файл, который нужно добавить, то продолжаем}
if OpenDialog1.Execute then
{если активна страница с ключами реестра то добавляем файл в реестр, иначе – в Win.ini}
if PageControl1.ActivePageIndex<4>then
begin
reg := Tregistry.Create;
if PageControl1.ActivePageIndex<2then
reg.RootKey:=key
else
reg.RootKey:=windows.HKEY_LOCAL_MACHINE;
case PageControl1.ActivePageIndex of
0: reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False);
1: reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', False);
2: reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServices', False);
3: reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunServicesOnce', False);
end;
//просим ввести имя константы для нового файла
path:=inputbox('Введите имя константы', '', Extractfilename OpenDialog1.filename));
{если имя не введено, то вместо него записываем имя добавляемого файла}
if path='' then
path := Extractfilename(OpenDialog1.filename);
pathfile := ExtractShortPathName(OpenDialog1.filename);
reg.WriteString(path, pathfile);
reg.CloseKey;
reg.Free;
with ListView1 do
begin
ListItem := Items.Add;
ListItem.Caption :=path;
ListItem.SubItems.Add(pathfile);
end;
end else
{если нужно добавить файл в Win.ini, то вызываем форму 2}
form2.show;
end;
Автор: Ivan Shyrko на 00:39 0 коммент.
Ярлыки: Сделай сам, Delphi
Вначале немного теории. Windows, судя по названию, это "сборище" окон. Каждое окно обычно содержит другие окна, т.е. является родителем для некоторых других окон (эти "другие окна" называют дочерними). Для нашей программы нам достаточно знать, что то поле, куда мы вводим пароли является хоть и маленьким, но окном. А значит, как и любое порядочное окно, оно имеет параметр "текст окна" и умеет принимать\отсылать сообщения. Именно на данных весьма полезных свойствах полей ввода основаны программы для извлечения паролей из-под "звёздочек".
Function GetText(WindowHandle: hwnd):string;
var
txtLength : integer;buffer: string;
begin//Узнаём длину текста
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);if txtlength>0 then
begintxtlength := txtlength + 1;
setlength (buffer, txtlength);//записываем текст окна в buffer
sendmessage(WindowHandle, wm_gettext, txtlength, longint(@buffer[1]));result := buffer;
end else result:='';end;
Теперь, если мы вызовем эту функцию, записав в параметр идентификатор поля ввода пароля, то она возвратит нам сам пароль. Как узнать идентификатор нужного окна будет рассказано далее. А сейчас поговорим о втором способе извлечения пароля. Только в данном способе мы не запишем пароль в какую-либо переменную, а заставим поле ввода отобразить вместо звёздочек нормальные символы. Для этого нужно послать ему сообщение EM_SETPASSWORDCHAR. Вообще, это сообщение используется и для того, чтобы нормальный текст заменить каким-либо символом (обычно используются звёздочки). Далее приведена процедура, которая не просто показывает нормальный текст вместо звёздочек, но, если у выбранного поля ввода текст не зашифрован, то мы заменяем его звёздочками. Т.е., если для поля ввода пароля применить эту процедуру, то появятся нормальные символы, а если для того же поля повторить операцию, то текст опять превратится в звёздочки.
Procedure ShowPass(h:hwnd);var
ch:integer;i:integer;
begin//узнаём, закодирован ли текст
ch:=SendMessage(h, EM_GETPASSWORDCHAR, 0, 0);//если закодирован, то раскодируем текст, иначе кодируем звёздочками
if ch>0 theni:=0
elsei:=ord('*');
SendMessage(h, EM_SETPASSWORDCHAR, i, 0);end;
Теперь можно приступить к созданию самой программы, но перед этим нужно оговорить принципы её функционирования:– пользователь должен как-то указать программе, какой именно пароль он хочет "вскрыть". Наиболее удобным для юзера способом мне представляется следующий: пользователь наводит курсор мышки на поле ввода с нужным паролем, нажимает определённую комбинацию клавиш и получает взамен "звёздочек" нормальный пароль.
1) Заменяем "звёздочки" на обычные символы;
2) Выделяем весь текст в поле ввода;3) Копируем выделенный текст в буфер обмена;
4) Обратно маскируем пароль "звёздочками.Теперь запускаем Delphi и делаем формочку, взяв за образец рис.1.
h:HWND;
ch:Integer;s:String;
Процедура обработки нажатия на кнопку "Показать\Спрятать пароль":procedure TForm1.Button1Click(Sender: TObject);
begin//узнаём координаты курсора мыши
getcursorpos(p);//получаем идентификатор окна, находящегося под курсором мыши
h:=windowfrompoint(p);//прячем\показываем пароль
ShowPass(h);//перерисовываем окно
InvalidateRect(h, nil, true);end;
Данная процедура позволяет маскировать\демаскировать текст почти любого поля ввода.Процедура обработки нажатия на кнопку "Скопировать пароль":
procedure TForm1.Button2Click(Sender: TObject);begin
//узнаём координаты курсора мышиgetcursorpos(p);
//получаем идентификатор окна, находящегося под курсором мышиh:=windowfrompoint(p);
//каким символом замаскирован текст в данном окне?ch:=SendMessage(h, EM_GETPASSWORDCHAR, 0, 0);
//если пароль замаскирован, то показываем его в нормальном видеif ch>0 then
SendMessage(h, EM_SETPASSWORDCHAR, 0, 0);//выделяем весь текст
SendMessage(h, EM_SETSEL, 0, -1);//копируем выделенный текст
SendMessage(h, WM_COPY, 0, 0);//если мы "вскрывали" пароль, то опять маскируем его
if ch>0 thenSendMessage(h,EM_SETPASSWORDCHAR, ch, 0);
//перерисовываем окноInvalidateRect(h, nil, true);
end;procedure TForm1.Button3Click(Sender: TObject);
begin//узнаём координаты курсора мыши
getcursorpos(p);//получаем идентификатор окна, находящегося под курсором мыши
h:=windowfrompoint(p);//получаем текст окна
s:=gettext(h);//если текст не является пустой строкой, то показываем его пользователю
if s<>'' thenbegin
setforegroundwindow(form1.handle);showmessage(s);
end;end;
В принципе программа уже готова к эксплуатации. Но для удобства пользователя сделаем, как и собирались, поддержку "горячих клавиш". Для этого мы воспользуемся функцией
RegisterHotKey(HWND hWnd, // этому окну придёт уведомление о нажатии
комбинации клавишint id, // идентификатор "горячих клавиш"
UINT fsModifiers, // должны ли быть нажаты клавиши Ctrl, Shift или AltUINT vk // код клавиши, на которую мы будем реагировать
);Для события OnCreate формы запишите процедуру:
procedure TForm1.FormCreate(Sender: TObject);begin
//регистрируем сочетание Shift+Alt+F9If not RegisterHotkey
(Handle, 1, MOD_ALT or MOD_SHIFT, VK_F9) ThenShowMessage('Нельзя использовать данное сочетание клавиш!');
//регистрируем сочетание Shift+Alt+F8If not RegisterHotkey
(Handle, 2, MOD_ALT or MOD_SHIFT, VK_F8) ThenShowMessage('Нельзя использовать данное сочетание клавиш!');
//регистрируем сочетание Shift+Alt+F7If not RegisterHotkey
(Handle, 3, MOD_ALT or MOD_SHIFT, VK_F7) ThenShowMessage('Нельзя использовать данное сочетание клавиш!');
end;Procedure WMHotkey( Var msg: TWMHotkey ); message WM_HOTKEY;
А вот и сама процедура:Procedure TForm1.WMHotkey( Var msg: TWMHotkey );
begincase msg.hotkey of
//если нажато Shift+Alt+F9, то копируем пароль1:begin
getcursorpos(p);h:=windowfrompoint(p);
ch:=SendMessage(h,EM_GETPASSWORDCHAR,0,0);if ch>0 then
SendMessage(h,EM_SETPASSWORDCHAR,0,0);SendMessage(h,EM_SETSEL,0,-1);
SendMessage(h,WM_COPY,0,0);if ch>0 then
SendMessage(h,EM_SETPASSWORDCHAR,ch,0);InvalidateRect(h,nil,true);
end;//если нажато Shift+Alt+F8, то прячем\показываем пароль пароль
2:begingetcursorpos(p);
h:=windowfrompoint(p);ShowPass(h);
InvalidateRect(h,nil,true);end;
//если нажато Shift+Alt+F9, то показываем пароль в отдельном окне3:begin
getcursorpos(p);h:=windowfrompoint(p);
s:=gettext(h);begin
setforegroundwindow(form1.handle);showmessage(s);
end;end;
end;end;
P. S.
Разумеется, данную программу нельзя применять ни в каких деструктивных целях.Автор: Ivan Shyrko на 02:57 0 коммент.
Ярлыки: Сделай сам, Delphi
<style>
<b:if cond='data:blog.pageType == "item"'>
span.fullpost {display:inline;}
<b:else/>
span.fullpost {display:none;}
</b:if>
<style>
<b:if cond='data:blog.pageType != "item"'><br />
<a expr:href='data:post.url'>Читать дальше>>!</a>
</b:if>
Теперь осталось оформить неотображаемую часть каждого поста тегом <span class="fullpost"></span>. Пример: Автор: Ivan Shyrko на 04:32 0 коммент.
Ярлыки: блог