Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

Hook на изменения Clipboard а ... ?   Найти похожие ветки 

 
Wm.DIGGER ©   (2005-07-20 22:21) [0]

Господа, пожалуйста, не могли бы вы НАПИСАТЬ ПРИМЕР, как
поставить хук на изменение содержимого clipboard"а?
Только не нужно "умных" фраз, типа "читай мануалы",
или "SetClipboardViewer а дальше смотри сам ...".
Эти фразы есть на каждом сайте, где были вопросы подобные
моему, ещё ни где я не нашёл ОТВЕТА.

Мой хук:


library Hook;

uses
 Windows,
 SysUtils,
 Messages,
 Dialogs;

var MHook:HHook = 0;
   WMPaint:boolean=false;

{$R *.res}

function HCallBack(code : integer; wparam : wparam; lparam : lparam) : lresult; stdcall;
var tag:^tagMSG;
begin
tag := ptr(lparam);
if tag^.message = WM_DRAWCLIPBOARD then showmessage("WM_DRAWCLIPBOARD");
Result := CallNextHookEx(MHook, code, wparam, lparam);
end;

procedure Set_Hook; export;
begin
MHook := SetWindowsHookEx(WH_CALLWNDPROC, @HCallBack, HInstance, 0);
end;

procedure Release_Hook; export;
begin
UnHookWindowsHookEx(MHook);
MHook := 0;
end;

exports
Set_Hook index 1,
Release_Hook index 2;
begin
end.


как, видете, всё довольно стандартно. опишите:
во-первых, где вызывать SetClipboardViewer?
во-вторых, если не сложно, пример напишите ...
спасибо!


 
Davinchi9   (2005-07-20 23:33) [1]

unit unMonitor;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Clipbrd;

type
 TfrmMonitor = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
   FNextViewerHandle: HWND;
   BufferText: String;
   procedure WMDrawClipboard(var message : TMessage); message WM_DRAWCLIPBOARD;
   procedure WMChangeCBCHain(var message : TMessage); message WM_CHANGECBCHAIN;
 end;

var
 frmMonitor: TfrmMonitor;

implementation

uses VcotObj;

{$R *.dfm}

procedure TfrmMonitor.WMDrawClipboard(var message : TMessage);
begin
message.Result:=SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);
 if Clipboard.AsText<>"" then
   begin
     BufferText:=Clipboard.AsText; // ВОТ ЧТО ТЕБЕ НУЖНО
     OnClick(nil);
   end;
end;

procedure TfrmMonitor.WMChangeCBCHain(var message : TMessage);
begin
if message.wParam = FNextViewerHandle then
  begin
  FNextViewerHandle := message.lParam;
  message.Result := 0;
 end
 else
 message.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, message.wParam, message.lParam);
end;

end.


 
GrayFace ©   (2005-07-21 00:12) [2]

Wm.DIGGER ©   (20.07.05 22:21)
как, видете, всё довольно стандартно.


Нет. По стандарту, MHook и WMPaint надо в MMF помещать и Code проверять. См. справку, статью "hooks". В статье есть, как минимум, 2 глюка: wParam:word и stdcall у DllMain(или как там ее).


 
Wm.DIGGER ©   (2005-07-21 00:38) [3]


> Нет. По стандарту, MHook и WMPaint надо в MMF помещать и
> Code проверять. См. справку, статью "hooks". В статье есть,
> как минимум, 2 глюка: wParam:word и stdcall у DllMain(или
> как там ее).


ну, WMPaint:boolean=false; - это вообще мусор, случайно не стёр :) а статьи эти очень "красиво" написаны конечно, только вот примеров рабртающих там нет ни где.

P.S. может я и ошибаюсь,ты бы ссылку на статью кинул ... :)


 
Wm.DIGGER ©   (2005-07-21 00:49) [4]


> Davinchi9   (20.07.05 23:33) [1]


а ты это проверял?
что-то у меня это не работает, и честно говоря я ни понимаю, как это должно работать?
мне нужно перехватить событие WM_DRAWCLIPBOARD при заполнении буфера любым приложением. поэтому я хук и писал. и я точно знаю, чтобы поставить своё приложение в качестве "монитора" буфера нужно использовать функцию SetClipboardViewer - это в RSND написано. Только вот не написано где и как её использовать?


 
Davinchi ©   (2005-07-21 00:55) [5]

я кинул реальный код, который сам использовал...
ото включается в класс формы и ловятся события...

SetClipboardViewer - когда действительно делаешь ХУК, а это на основе событий...


 
Wm.DIGGER ©   (2005-07-21 01:01) [6]


> Davinchi ©   (21.07.05 00:55) [5]


слушай, будь хорошим человеком, напиши маленькую прогу, чтобы работал твой код и кинь мне на мыло ... плиззз!


 
Набережных С   (2005-07-21 15:56) [7]

unit ClipboardMonitor;

interface

uses
 Windows, Messages, Classes;

const
 SM_CLIPBRDCHANGE = WM_USER + 455;

type
 TClipboardMonitor = class
 private
   FWnd: HWND;
   FEnable: boolean;
   FOnChange: TNotifyEvent;
   FNextClipbView: HWND;
   procedure SetEnable(const Value: boolean);
 protected
   procedure CreateWindow;
   procedure DestroyWindow;
   procedure DoChange; dynamic;
   procedure WndProc(var Message: TMessage);
   procedure ChangeNotify(var Message: TMessage); message SM_CLIPBRDCHANGE;
   procedure DRAWCLIPBOARD(var Message: TMessage); message WM_DRAWCLIPBOARD;
   procedure CHANGECBCHAIN(var Message: TMessage); message WM_CHANGECBCHAIN;
 public
   destructor Destroy; override;
   procedure DefaultHandler(var Message); override;
   property Enable: boolean read FEnable write SetEnable;
   function HasFormat(Format: Cardinal): boolean;
   property OnChange: TNotifyEvent read FOnChange write FOnChange;
 end;

implementation

{ TClipboardMonitor}

procedure TClipboardMonitor.CHANGECBCHAIN(var Message: TMessage);
begin
 with Message do if FNextClipbView <> HWND(WParam) then
   SendMessage(FNextClipbView, WM_CHANGECBCHAIN, WParam, LParam)
 else
   FNextClipbView:=LParam;
end;

procedure TClipboardMonitor.ChangeNotify(var Message: TMessage);
begin
 DoChange;
end;

procedure TClipboardMonitor.CreateWindow;
begin
 if FWnd = 0 then FWnd:=AllocateHWnd(WndProc);
end;

procedure TClipboardMonitor.DestroyWindow;
begin
 if FWnd <> 0 then DeallocateHWnd(FWnd);
 FWnd:=0;
end;

procedure TClipboardMonitor.DefaultHandler(var Message);
begin
 with TMessage(Message) do
   Result:=DefWindowProc(FWnd, Msg, WParam, LParam);
end;

destructor TClipboardMonitor.Destroy;
begin
 SetEnable(false);
 inherited;
end;

procedure TClipboardMonitor.DoChange;
begin
 if Assigned(FOnChange) then FOnChange(Self);
end;

procedure TClipboardMonitor.DRAWCLIPBOARD(var Message: TMessage);
begin
 if FNextClipbView <> 0 then with Message do
   SendMessage(FNextClipbView, Msg, WParam, LParam);
 PostMessage(FWnd, SM_CLIPBRDCHANGE, 0, 0);
end;

function TClipboardMonitor.HasFormat(Format: Cardinal): boolean;
begin
 Result:=IsClipboardFormatAvailable(Format);
end;

procedure TClipboardMonitor.SetEnable(const Value: boolean);
begin
 if Value = FEnable then Exit;
 if Value then
 begin
   CreateWindow;
   FNextClipbView:=SetClipboardViewer(FWnd)
 end
 else
 begin
   ChangeClipboardChain(FWnd, FNextClipbView);
   DestroyWindow;
 end;
 FEnable:=Value;
end;

procedure TClipboardMonitor.WndProc(var Message: TMessage);
begin
 Dispatch(Message);
end;

end.


 
Wm.DIGGER ©   (2005-07-22 16:33) [8]

Набережных С   (21.07.05 15:56) [7]

спасибки!
но мне нужно через ХУК, а не через события.
неужели ни кто ни когда этого с хуками не делал.

приведённый мной ХУК запросто отлавливает клаву, например
(ну, при соответствующих изменениях типа ХУКА).
А вот КАК всё-таки с помощью хука отловить события Clipboard"a?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.01 c
4-1121187841
GEN++
2005-07-12 21:04
2005.09.11
Включение/выключение устройства


5-1098516662
kaif
2004-10-23 11:31
2005.09.11
TAllegroMDIBar: проблема с сообщением WM_GETTEXT под "стилем XP"


1-1124537780
Агент Х-СОМ
2005-08-20 15:36
2005.09.11
Отладка компонентов


1-1124696985
_Landgraf_
2005-08-22 11:49
2005.09.11
Использование RichEdit


3-1122904417
Ольга
2005-08-01 17:53
2005.09.11
Не выполняется запрос к VIEW





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский