Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2009, 20:48   #1
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию использование GWL_WNDPROC

Возможно ли подменять функцию WinProc с помощью "SetWindowLong" многократно, тоесть регистрировать одну и ту же ф-ию для разных окон.

вот типо так:

Код:
function NewProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: 
begin
  ..................
    Result:= CallWindowProc(Find.FWinProc, hWnd, uMsg, wParam, lParam);
end; 

begin

Event1.FWinProc:= WNDPROC(SetWindowLong(FHwnd1, GWL_WNDPROC, LongInt(@NewProc)));
  ..................
Event2.FWinProc:= WNDPROC(SetWindowLong(FHwnd2, GWL_WNDPROC, LongInt(@NewProc)));

end.
Просто в моей проге неопределенное количество окон с которыми нужно поработать. Такой код опасен? Есть альтернатива?
user_jasser вне форума Ответить с цитированием
Старый 19.01.2009, 20:51   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от user_jasser Посмотреть сообщение
Такой код опасен? Есть альтернатива?
ну во-первых, смотря какой код будет у твоей оконной процедуры.

Цитата:
Сообщение от user_jasser Посмотреть сообщение
Возможно ли подменять функцию WinProc с помощью "SetWindowLong" многократно, тоесть регистрировать одну и ту же ф-ию для разных окон.
ну попробуй. а почему нельзя?
rpy3uH вне форума Ответить с цитированием
Старый 19.01.2009, 21:02   #3
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
Вопрос

Код:
TRegistrEvent = class
  private
  public
    FLink: TRegistrEvent;
    FFunc: PChar;
    FWinProc: WNDPROC;
    FHwnd: hWnd;
  end;          

function NewProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  next: TRegistrEvent;
begin
  next:= EventHead;
  try
    while not(next=Nil) do begin
      if(next.FHwnd=hWnd)then
        exit;
      next:= next.FLink;
    end;
  MessageBox(0, 'HWND is not found', '!', MB_ICONERROR or MB_OK);
  finally
    lua_getglobal(vj_Lua.this, next.FFunc);
    lua_pushnumber(vj_Lua.this, hWnd);
    lua_pushnumber(vj_Lua.this, uMsg);
    lua_pushnumber(vj_Lua.this, wParam);
    lua_pushnumber(vj_Lua.this, lParam);
    lua_pcall(vj_Lua.this, 4, 0, 0);
    //vj_Lua.call(next.FFunc, [hWnd]);
    Result:= CallWindowProc(next.FWinProc, hWnd, uMsg, wParam, lParam);
  end;
end;

    function lua_RegistEvent(L: Plua_State): Integer; cdecl;
    var Event: TRegistrEvent;
    begin
      Event:= TRegistrEvent.Create;
      Event.FHwnd:= lua_tointeger(vj_Lua.this, 1);
      Event.FFunc:= lua_tostring(vj_Lua.this, 2);
      Event.FWinProc:= WNDPROC(SetWindowLong(Event.FHwnd, GWL_WNDPROC, LongInt(@NewProc)));
      Event.FLink:= EventHead;
      EventHead:= Event;
    end;
Прога виснит ... Можеть всеже нельзя так? Или я гдето натупил?
user_jasser вне форума Ответить с цитированием
Старый 20.01.2009, 09:30   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

насколько я понял ты делаешь односвязанный список, каждый элемент в котором это класс. зачем это надо?

ты где-то здесь накуралесил
Код:
    var Event: TRegistrEvent;
    begin
      Event:= TRegistrEvent.Create;
      Event.FHwnd:= lua_tointeger(vj_Lua.this, 1);
      Event.FFunc:= lua_tostring(vj_Lua.this, 2);
      Event.FWinProc:= WNDPROC(SetWindowLong(Event.FHwnd, GWL_WNDPROC, LongInt(@NewProc)));
      Event.FLink:= EventHead;
      EventHead:= Event;
и вообще что ты собираешься сделать?
rpy3uH вне форума Ответить с цитированием
Старый 20.01.2009, 14:01   #5
user_jasser
я не ~
Пользователь
 
Аватар для user_jasser
 
Регистрация: 19.09.2008
Сообщений: 58
По умолчанию

Цитата:
насколько я понял ты делаешь односвязанный список, каждый элемент в котором это класс. зачем это надо?
ну это надо для того, что бы в ф-ии NewProc можно было отыскать нужный экземпляр класса, по хендлу окна. Там же происходит вызов найденной ф-ии в интерпретируемом скрипте_Lua.
Тоесть, таким образом, хотелось бы управлять событиями окон, без компиляции проги.
user_jasser вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование TOleContainer John_chek Общие вопросы Delphi 1 08.07.2008 13:01
Использование обьектов UberStas Помощь студентам 2 13.06.2008 18:55
Использование 2х форм Zeraim Общие вопросы Delphi 4 27.05.2008 17:14
использование TThread amandra Общие вопросы Delphi 6 03.05.2008 03:13