Форум: "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.011 c