![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с ловушками... [D6, D7, Win95/98, WinME, Win2k, WinXP]
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]ну ты и насоздовал тем... давайте истиной считать эту тему...