Делаю некую софтину редактирования карт. Перетаскивание линий, фигур, точек реализую drag'n'drop'ом. Вопрос такой - как заставить курсор мыши прилипнуть к перетаскиваемому объекту, когда перетаскивание невозможно? Ведь в принципе Windows так может?
Вот один из примеров окна, которое нельзя закрыть мышью непосредственно. <font size=1><font face="fixedsys] const WH_MOUSE_LL = 14; var hhk: THandle; h: THandle; function MouseProc(nCode, wp, lp: Integer): Integer; stdcall; var phs: ^TPoint; begin SetCursorPos (100, 100); result := CallNextHookEx (hhk, nCode, wp, lp); end; var msg: tagMSG; begin h := CreateWindow ('button', 'OK', WS_SYSMENU or WS_VISIBLE, 200, 200, 100, 50, 0, 0, hInstance, nil); hhk := SetWindowsHookEx (WH_MOUSE, MouseProc, hInstance, GetCurrentThreadId); // GetCurrentThreadId () while (IsWindow (h) and GetMessage (msg, h, 0, 0)) do begin TranslateMessage (msg); DispatchMessage (msg); end; UnhookWindowsHookEx (hhk); end. </font><!--face--></font><!--size--> Для широкой блокировки перемещения мыша, подобную ловушку возможно придется в DLL организовать.
alpet все, спасибо, разобрался, это наверное кривое решение но все-таки работающее а с ClipCursor я пробовал делать но чего-то не вышло :-( руки наверно кривые
slow Имхо все-же в данном случае лучше использовать ClipCursor. Эта функция работает с экранными координатами, и у меня никаких проблем с ней не возникало. Например след. код останавливает курсор в том месте где он был до запуска программы. (В аттаче скомпиленный пример) <font face="fixedsys] Uses Windows; var msg: tagMSG; h: THandle; r: TRect; p: TPoint; begin h := CreateWindow ('button', 'OK', WS_SYSMENU or WS_VISIBLE or WS_MAXIMIZE, 200, 200, 100, 50, 0, 0, hInstance, nil); SetCapture(h); GetCursorPos (p); SetRect (r, p.x, p.y, p.x + 1, p.y + 1); ClipCursor (@r); while (IsWindow (h) and GetMessage (msg, h, 0, 0)) do begin TranslateMessage (msg); DispatchMessage (msg); end; end. </font><!--face--> 1816865872__mh.zip