Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с ловушками... [D6, D7, Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2

MouseAlexander ©   (2004-12-06 17:02:00) 

Здравствуйте... И сразу к делу. Есть программа, которая использует ловушку на события
мыши (мышеловку :). При нажатии на среднюю кнопку мыши главное окно формы должно
показываться (если оно не было видимым) или исчезать... Вроде все просто... Но вот
проблемы:
1. При работе программы проводник (explorer.exe) вылетает с "рантайм еррор"... Чего
вдруг?
2. Форма показываеться только один раз. Т.е. запустил программу, нажал ср. кнопку, форма
исчезла, еще раз нажал - показалась, а дальше - нажимаю, и ничего не происходит...

Вот код dll-ки и главного модуля:
library mhook;

uses
 Windows, Messages;

const
 UM_MOUSEHOOK = WM_USER + 101;
 GLOBALMAPID = '{DCC9CEE7-6BC8-41C6-8CF4-7CF050B1FBC5}';

type
 PShareInf = ^TShareInf;
 TShareInf = record
               appWndHandle: HWND;
               oldHookHandle: HHOOK;
               hm: THandle;
             end;

var
 mapHandle: THandle = 0;
 shareInf: PShareInf = nil;

procedure DLLEntryPoint(dwReason: DWORD); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH:
   begin
     MapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0,
SizeOf(TShareInf), GLOBALMAPID);
     ShareInf := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
   end;
   DLL_PROCESS_DETACH:
   begin
     UnMapViewOfFile(ShareInf);
     CloseHandle(MapHandle);
   end;
 end;
end;

function MouseHook(nCode, wParam, lParam: Integer): LResult; stdcall;
var
 lpbuf: lpstr;
begin
 if nCode in [HC_ACTION, HC_NOREMOVE] then
 begin
   if wParam = WM_MBUTTONDOWN then
   begin
     PostMessage(shareInf.appWndHandle, UM_MOUSEHOOK, wParam, lParam);
   end;
 end;
 Result := CallNextHookEx(shareInf.oldHookHandle, nCode, wParam, lParam);
end;

function SetMouseHook(wnd: HWnd): Boolean;
begin
 if shareInf <> nil then
 begin
   shareInf^.AppWndHandle := Wnd;
   shareInf^.OldHookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHook, HInstance, 0);
   Result := shareInf^.OldHookHandle <> 0;
 end else
   Result := false
end;

function RemoveMouseHook: Boolean;
begin
 Result := UnhookWindowsHookEx(shareInf^.OldHookHandle);
 CloseHandle(shareInf^.hm);
end;

exports
 SetMouseHook,
 RemoveMouseHook;

begin
 DLLProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


unit u_MAIN;
....
function SetMouseHook(wnd: HWnd): Boolean; external и т.д.
...
procedure TfrmMain.Formcreate(Sender: TObject);
begin
 SetMouseHook(Handle);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
 RemoveMouseHook;
end;

procedure TfrmMain.UmMouseHook(var msg: TMessage);
begin
 Visible := not Visible;
end;
...

Что тут не так?
Заранее спасибо!
И еще: ответы по сути просьба также слать мне на мыло (поожаалууйстаа)


КЕНТ   (2004-12-06 23:48:00) [21]

Серьезно нужна помощь, ну неужели это так трудно?


MouseAlexander   (2004-12-06 17:45:00) [22]

просто были ошибки сервера и я пока понял что темы находяться далеко в низу, форум нужно доработать... но не важно, у меня есть своя проблема которую нужно решить!!!


Piter   (2004-12-06 17:38:00) [23]

ну ты и насоздовал тем... давайте истиной считать эту тему...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо