![]() |
|
|
#1
|
|||
|
|||
|
Добрый день, у меня возник вопрос, как научить программу различать что находится в буфере обмена?
Например: goo.gl vk.cc 8723938474 B744jfedoijge И что бы она все это могла различать друг от друга, а потом выполнила разные команды? Вот например код, который если в буфере 11 символов, заменит их и выведет кол-во символов (i) Код:
begin
s:=clipboard.AsText;
Clipboard.Open;
i:=Clipboard.GetTextBuf(PChar(s),500);
if i=11 then
begin
Clipboard.SetTextBuf('получилось');
ShowMessage(IntToStr(i));
end;
end.А вот как сделать что бы он распознавал текст и делил их на разные типы, пока придумать не могу. Последний раз редактировалось Admin, 01.04.2018 в 18:42. |
|
#2
|
|||
|
|||
|
неясна постановка задачи.
что программа должна делать? по ключевым словам выполнять разные действия??? Ну тогда типа так можно: Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Clipbrd;
procedure TForm1.Button1Click(Sender: TObject);
var
s : String;
begin
s := trim(edit1.text);
Clipboard.AsText := s;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
cmd : String;
begin
cmd := Trim(Clipboard.AsText);
if cmd = '' then exit; // no commands
if cmd = 'goo.gl' then ShowMessage('Open GOOGLE!')
else if cmd = 'vk.cc' then ShowMessage('Kontaktil!!!!')
else if cmd = '8723938474' then ShowMessage('Call 8723938474')
else ShowMessage(Format('Unknown command (%s).',[cmd]));
end;
end.Вместо ShowMesage ставишь процедуры, которые выполняют соотв. действия. |
|
#3
|
|||
|
|||
|
Согласен, сформулировал не точно.
Нужно что бы программа работала без формы и могла распознавать ссылки. Код в самой сути написан верно, но надо к примеру goo.gl/blabla(любая сокращенная ссылка через goo.gl) или vk.cc/sokratit(тоже самое) он определял их, и если видел, то выполнял какие-то команды. Т.е. что то попадает в буфер обмена, он заметил, если это телефон - 1 сценарий goo.gl/..... - 2 сценарий и т.п.. Получается еще нужно все в цикл обернуть, что бы программа работала постоянно. Если поможете, буду супер признателен, препод отлично обещал;D |
|
#4
|
||||
|
||||
|
"Регистрируете" свое окно как обозреватель буфера обмена..
Цитата:
|
|
#5
|
|||
|
|||
|
Ох, информации). Спасибо, буду сидеть разбираться;3
|
|
#6
|
|||
|
|||
|
Еще маленький уточняющий, но очень важный вопрос: т.е. без углубленных знаний этот проект реализовать не получиться? Друг подобный код написал на AutoIt за месяц обучения
|
|
#7
|
||||
|
||||
|
Цитата:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure WMChangeCBChain(var Msg: TWMChangeCBChain);
message WM_CHANGECBCHAIN;
procedure WMDrawClipboard(var Msg: TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
PrevHwnd: Hwnd;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMChangeCBChain(var Msg: TWMChangeCBChain);
begin
if PrevHWnd = Msg.Remove then PrevHWnd:= Msg.Next;
if Msg.Remove <> Handle then
SendMessage(PrevHWnd, WM_CHANGECBCHAIN, Msg.Remove, Msg.Next);
end;
procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);
function tk(ds: string): boolean;
var
i, b: integer;
begin
b:= 0;
for i := 1 to length(ds) do if ds[i] in ['0'..'9'] then inc(b);
Result:= (b = Length(ds));
end;
var
P: PChar;
H: THandle;
i, b: integer;
s: string;
begin
SendMessage(PrevHWnd, WM_DRAWCLIPBOARD, 0, 0);
if Clipboard.HasFormat(CF_TEXT) then
begin
H := Clipboard.GetAsHandle(CF_TEXT);
P := GlobalLock(H);
// Memo1.SetTextBuf(P);
memo1.Lines.Add(String(P));
GlobalUnlock(H);
for i := 0 to Memo1.Lines.Count-1 do
begin
s:= Memo1.Lines[i];
if Length(s) <> 0 then
begin
if pos('.', s) > 0 then Memo1.Lines[i]:= '1 сценарий: адрес - ' + s;
if tk(s) then Memo1.Lines[i]:= '2 сценарий: номер телефона - ' + s;
end;
end;
Msg.Result:= 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PrevHwnd:= SetClipboardViewer(Handle);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain(Handle, PrevHwnd);
end;
end. |
|
#8
|
|||
|
|||
|
Цитата:
Я попытался раздуплится и вроде понял +-70% кода;D. Но смысл в том, что программа должна просто добавляться в процессы и оттуда следить за буфером, без форм. Хоп, в буфер попало что-то ей знакомое - она выполняет команды. Вот я пример попытался сделать Ссылка vk.cc 1 сценарий: vk.cc/test https://vk.cc/5EcP6W //Ссылка на YouTube Ссылка goo.gl 2 сценарий: goo.gl/test https://goo.gl/adTnWE //Ссылка на YouTube Номер телефона 3 сценарий: 89117773222 +79117773222 79117773222 +380777226697 380777226697 Все написано к примеру 1 сценарий: ShowMessage('Это vk.cc'); 2 сценарий: ShowMessage('Это goo.gl'); 3 сценарий ShowMessage('Это номер телефона'); Если возможно, объясните по полочкам для таких баобабов как я;D и история вас не забудет;D( ну и я лично) Опять же сошлюсь на то, что друг за месяц сделал такую же программу (на AutoIT), только с огромным пулом вот этих самых 'сценариев'. Экскюзми если я где-то туплю( а я могу), но мне просто это все потом преподу объяснять нужно будет;D |
|
#9
|
||||
|
||||
|
Минимальное (консольное) приложение на делфи выглядит так
Код:
program mini;
{$APPTYPE CONSOLE}
{$R *.RES}
begin
...
end;Ну и чего там объяснять - хукается системный буфер обмена, если в нём что-то заводится новенького, идёт реакция на это, проще некуда, не понимаю :-) |