![]() |
|
#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
|
||||
|
||||
![]() "Регистрируете" свое окно как обозреватель буфера обмена..
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#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; Ну и чего там объяснять - хукается системный буфер обмена, если в нём что-то заводится новенького, идёт реакция на это, проще некуда, не понимаю :-) Я не понял Вашего вопроса, но всё же Вам на него отвечу! |