Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
14-1105115023
X9
2005-01-07 19:23
2005.01.23
Проблемы с принтером HP LaserJet 1010


14-1104714149
Xenon
2005-01-03 04:02
2005.01.23
Ну зацените плиз


1-1105423227
Руслан
2005-01-11 09:00
2005.01.23
ExcelApplication


14-1104578232
speed
2005-01-01 14:17
2005.01.23
Новый год!


14-1104986927
Чеширский_Кот
2005-01-06 07:48
2005.01.23
"Человек в лабиpинте" Роберта Силверберга





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский