Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1102053755
Rext
2004-12-03 09:02
2005.01.23
Получение списка запущенных прочессов


14-1104855832
Гаврила
2005-01-04 19:23
2005.01.23
Голотропное дыхание


9-1097692756
rts111
2004-10-13 22:39
2005.01.23
Полезные утилиты


14-1104700309
Vaitek
2005-01-03 00:11
2005.01.23
Это у всех Опера глючит или только у меня?


4-1101999562
Priest
2004-12-02 17:59
2005.01.23
Остановка дочернего потока





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