Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизWinApi Найти похожие ветки
← →
W00dy © (2004-12-04 07:40) [0]Как переопределить обработчик событий для чужого окна имея только его хендл. Киньте пример.
← →
Digitman © (2004-12-04 11:41) [1]нужно в кодовом потоке, создавшем это окно, вызвать SetWindowLong
← →
Xaker © (2004-12-04 12:28) [2]пример (блокирока КАД)
function MyWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
ready:=false;
if msg=WM_HOTKEY then begin
// Поймали HOTKEY CAD (CSE) - выводим сообщение на десктоп "Default" и затем выходим
if( MAKELONG( MOD_CONTROL or MOD_ALT, VK_DELETE ) = lParam )then
begin
MessageBoxEx(0,"Ctrl + Alt + Del","FIGA1", MB_DEFAULT_DESKTOP_ONLY, 0 );
result:= 0;
ready:=True;
end;
if( MAKELONG( MOD_CONTROL or MOD_SHIFT, VK_ESCAPE ) = lParam ) then
begin
MessageBoxEx(0,"Ctrl + Shift + Esc","FIGA2", MB_DEFAULT_DESKTOP_ONLY, 0 );
result:= 0;
ready:=True;
end;
if not ready then result:= CallWindowProc(SavedProc, hWnd, Msg, wParam, lParam);
end
else result:= CallWindowProc(SavedProc, hWnd, Msg, wParam, lParam);
end;
procedure SetWndProc(hWnd: HWND);
begin
SavedProc:= pointer(SetWindowLong(hWnd, GWL_WNDPROC, cardinal(@myWndProc)));
end;
procedure UnSetWndProc(hWnd: HWND);
begin
SavedProc:= pointer(SetWindowLong(hWnd, GWL_WNDPROC, cardinal(SavedProc)));
end;
← →
Leonid Troyanovsky (2004-12-04 19:56) [3]
> W00dy © (04.12.04 07:40)
> Как переопределить обработчик событий для чужого окна имея
> только его хендл. Киньте пример.
Например, сабклассируем EDIT у блокнота.
procedure TForm1.Button1Click(Sender: TObject);
var
h: HWND;
lib: THandle;
f: procedure (control: HWND; procidx: Word; param: DWord);
begin
h := FindWindow("Notepad", nil);
h := FindWindowEx(h, 0, "EDIT", nil);
lib := LoadLibrary("hksub.dll");
Win32Check(lib <> 0);
f := GetProcAddress(lib, "SubClassControl");
f(h, 1, Memo1.Handle);
FreeLibrary(lib);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
h: HWND;
lib: THandle;
f: procedure (control: HWND; procidx: Word; param: DWord);
begin
h := FindWindow("Notepad", nil);
h := FindWindowEx(h, 0, "EDIT", nil);
lib := LoadLibrary("hksub.dll");
Win32Check(lib <> 0);
f := GetProcAddress(lib, "SubClassControl");
f(h, 0, 0);
FreeLibrary(lib);
end;
-------------hksub.dpr----------------------
library hksub;
uses
windows,
messages;
const
sPropOldWindowProc = "OldWindowProc";
sPropLib = "lib";
var
param : DWord = 0;
oldwndproc: Pointer = nil;
function NewWndProc1(h: HWND; msg: UINT; wparam: WPARAM; lparam: LPARAM ):LResult; stdcall;
begin
if msg = WM_CHAR then
begin
PostMessage(param, msg, wparam, lparam);
Beep(1000, 55);
end;
Result := CallWindowProc(oldwndproc, h, msg, wparam, lparam);
end;
function hookproc(ncode: Longint; awparam:WPARAM; alparam:LPARAM):LResult;stdcall;
var
msg: PCWPSTRUCT;
buf: array [0..MAX_PATH] of Char;
owp, nwp: Pointer;
lib: THandle;
hcontrol : HWND;
begin
Result := 0;
msg := PCWPSTRUCT(alparam);
if (msg.message = WM_NULL) then
begin
hcontrol := msg.hwnd;
param := msg.lParam;
owp := Pointer(GetProp(hcontrol, sPropOldWindowProc));
if Assigned(owp) then
begin
SetWindowLong(hcontrol, GWL_WNDPROC, Longint(owp));
RemoveProp(hcontrol, sPropOldWindowProc);
end;
if (msg.wParam = 0) then
begin
lib := GetProp(hcontrol, sPropLib);
if lib <> 0 then
FreeLibrary(lib);
RemoveProp(hcontrol, sPropLib);
end
else
begin
nwp := GetProcAddress(Hinstance,PChar(MakeLong(msg.wParam, 0)));
if not Assigned(nwp) then
Exit;
GetModuleFileName(Hinstance, buf, SizeOf(buf));
lib := LoadLibrary(buf);
SetProp(hcontrol, sPropLib, lib);
owp := Pointer(GetWindowLong(hcontrol, GWL_WNDPROC));
oldwndproc := owp;
SetProp(hcontrol, sPropOldWindowProc, THandle(oldwndproc));
SetWindowLong(hcontrol, GWL_WNDPROC, Longint(nwp));
end;
end;
end;
procedure SubClassControl(control:HWND; procidx: Word; param: LParam);
var
tid : DWord;
hk: HHOOK;
begin
tid := GetWindowThreadProcessId(control);
hk := SetWindowsHookEx(WH_CALLWNDPROC, hookproc, Hinstance, tid);
SendMessage(control, WM_NULL, WPARAM(procidx), LPARAM(Param));
UnhookWindowsHookEx(hk);
SendMessage(control, WM_NULL, 0, 0);
end;
exports
SubClassControl,
NewWndProc1 index 1;
begin
end.
-------------EOF hksub.dpr----------------------
Что будет работать в 9x не уверен.
--
С уважением, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c