Главная страница
    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.034 c
1-1104938268
zt50
2005-01-05 18:17
2005.01.23
Запуск ярлыка


1-1104915962
jiny
2005-01-05 12:06
2005.01.23
Интеграция складской программы с 1С-Бухгалтерией


14-1105003107
Генератор идей
2005-01-06 12:18
2005.01.23
Правильные названия для программ


14-1104328970
Homer Simpson
2004-12-29 17:02
2005.01.23
Автомобиль (иномарка) для новичка: новый vs б/у


10-1082104097
Dark Elf
2004-04-16 12:28
2005.01.23
Программный выбор листа в Excel





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