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

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

Инвертировать мышь по оси Y [D7, WinXP]


Страницы:   1 2

HF-Trade ©   (2007-08-27 04:16:00) 

Народ, подскажите как сделать сабжик? -
Мне нуна, чтоб при запуске определенного приложения инвертировалась мышь. Отловить запущенно оно(нужное мне приложение) или нет - не проблема. А вот как мышку по Y заставить ползать наоборот я хз=(


@!!ex   (2007-08-31 01:00:00) [1]

> На мышЬ=)

Хуки ставятся на события.
Как геймдевелопер завляю - игры обрабатывают очень мало событиый. И события мыши туда не входят.


> Может узнать разрешение и если курсор меньше или равен 0
> или больше или равен разрешению по Y - откидывать его на
> 1 пиксель?

Пробуй, уод у тебя есть, мне лично влом. :)


HF-Trade   (2007-08-30 23:21:00) [2]


> @!!ex ©   (29.08.07 17:36) [21]

На мышЬ=)


> ТОлько не рекоменду подводить мышу к верхней или нижней
> грание экрана, ибо тогда будет крайне неприятный глюк, саязынный
> с отличием положения реального, от тго. куда мы перемещаем
> мышу.
> решения нормального пока не нашел, правда и не искал особо.
>


Может узнать разрешение и если курсор меньше или равен 0 или больше или равен разрешению по Y - откидывать его на 1 пиксель?


@!!ex   (2007-08-29 17:36:00) [3]

> [19] GrayFace ©   (28.08.07 19:06)


> [20] HF-Trade ©   (29.08.07 16:24)

На что хук ставитЬ? :)


HF-Trade   (2007-08-29 16:24:00) [4]

Да. Хук был бы предпочтительней.


GrayFace   (2007-08-28 19:06:00) [5]

ИМХО, хуки для этого больше бы подошли.


@!!ex   (2007-08-28 00:37:00) [6]

После запуска игры, когда мышь зафиксируеться, не двигая мышь, нужно нажать Alt+F10.
после чего все тоже самое. Alt+F11, Alt+F12.
Не тестировал на прогах с фиксацией мыши, тольк на играх, где фиксации нет.
Все ок. ТОлько не рекоменду подводить мышу к верхней или нижней грание экрана, ибо тогда будет крайне неприятный глюк, саязынный с отличием положения реального, от тго. куда мы перемещаем мышу.
решения нормального пока не нашел, правда и не искал особо.

program InvertMouse;

uses
 Windows,
 Messages,
 SysUtils;

var
 WND:HWND;
 Atom_Start,Atom_Stop,Atom_Fix, Atom_Close:Word;
 Working:boolean = false;
 Finished:boolean = false;
 Sleep_Time:integer;
 DelayTime, LastTime:integer;
 msg : TMsg;
 MousePos:TPoint;
 NewMousePos:TPoint;
 Fixed:boolean;
 FixedPos:TPoint;

function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
 case (Msg) of
   WM_CLOSE:
     begin
       PostQuitMessage(0);
     end;
   WM_HOTKEY: begin
       Result := 0;
       if wParam = Atom_Start then begin
         Working:=true;
         GetCursorPos(MousePos);
       end
       else
       if wParam = Atom_Stop then
         Working:=false
       else
       if wParam = Atom_Close then
         Finished:=true
       else
       if wParam = Atom_Fix then begin
         Fixed:=true;
         GetCursorPos(FixedPos);
       end;
      end;
   else
     Result := DefWindowProc(hWnd, Msg, wParam, lParam);  
 end;
end;

Function CreateHotKeyWnd:HWND;
var
 h_Instance : HINST;
 wndClass : TWndClass;
begin
 h_Instance := GetModuleHandle(nil);
 ZeroMemory(@wndClass, SizeOf(wndClass));

 with wndClass do
 begin
   style         := CS_OWNDC ;
   lpfnWndProc   := @WndProc;        // Set the window procedure to our func WndProc
   hInstance     := h_Instance;
   hCursor       := LoadCursor(0, IDC_ARROW);
   lpszClassName := 'InvertMouseWindowClass';
 end;

 Windows.RegisterClass(wndClass);

 Result:=CreateWindow('InvertMouseWindowClass','Invert Mouse',WS_BORDER,0,0,0,0,0,0,h_Instance,nil);
end;

begin
 Sleep_Time:=StrToInt(ParamStr(1));
 WND:=CreateHotKeyWnd;
 Atom_Start:=GlobalAddAtom('Hot Key Start Inverting');
 Atom_Stop:=GlobalAddAtom('Hot Key Stop Inverting');
 Atom_Close:=GlobalAddAtom('Hot Key Close Program');
 Atom_Fix:=GlobalAddAtom('Hot Key Fix Mouse Position');
 RegisterHotKey(WND,Atom_Start,MOD_ALT,VK_F11);
 RegisterHotKey(WND,Atom_Stop,MOD_ALT,VK_F12);
 RegisterHotKey(WND,Atom_Close,MOD_ALT,VK_F9);
 RegisterHotKey(WND,Atom_Fix,MOD_ALT,VK_F10);
 LastTime:=GetTickCount;

 while not finished do
 begin
   if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then begin
     if (msg.message = WM_QUIT) then
       finished := True
     else begin
      TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
   DelayTime:=GetTickCount()-LastTime;
   LastTime:=GetTickCount();
   if Delaytime<Sleep_Time then
     Sleep(Sleep_time-Delaytime);
   if Working then begin
     GetCursorPos(NewMousePos);
     if not Fixed or (NewMousePos.Y<>FixedPos.Y) then begin
       NewMousePos.Y:=MousePos.Y-(NewMousePos.Y-MousePos.Y);
       SetCursorPos(NewMousePos.X,NewMousePos.Y);
     end;
     MousePos:=NewMousePos;
   end;
 end;                                    

 GlobalDeleteAtom(Atom_Start);
 GlobalDeleteAtom(Atom_Stop);
 GlobalDeleteAtom(Atom_Close);
 GlobalDeleteAtom(Atom_Fix);
 DestroyWindow(WND);
end.


HF-Trade   (2007-08-28 00:28:00) [7]

Спасиб. Вроде работает=)


@!!ex   (2007-08-27 23:50:00) [8]

Проблемы будут, если игра фиксирует где нить курсор мыши, в экшенах это делаеться всегда.
Соответственно надо модифицировать прогу, чтобы она учитывала, что позиция куда игра кидает курсор - стартовая и двигать никуда не надо.
Минут через 40 может кину проги, учитывающей это.


@!!ex   (2007-08-27 23:44:00) [9]

На. Только при запуске нужно указывать как часто проверять позицию мыши. у меня при 10мс, вообще все очень плавно.
Запускаешь прогу, нажимаешь Alt+F11 - активируется инверсия, Alt+F12 - выключает, Alt+F9 закрывает прогу.

program InvertMouse;

uses
 Windows,
 Messages,
 SysUtils;

var
 WND:HWND;
 Atom_Start,Atom_Stop, Atom_Close:Word;
 Working:boolean = false;
 Finished:boolean = false;
 Sleep_Time:integer;
 DelayTime, LastTime:integer;
 msg : TMsg;
 MousePos:TPoint;
 NewMousePos:TPoint;

function WndProc(hWnd: HWND; Msg: UINT;  wParam: WPARAM;  lParam: LPARAM): LRESULT; stdcall;
begin
 case (Msg) of
   WM_CLOSE:
     begin
       PostQuitMessage(0);
     end;
   WM_HOTKEY: begin
       Result := 0;
       if wParam = Atom_Start then begin
         Working:=true;
         GetCursorPos(MousePos);
       end
       else
       if wParam = Atom_Stop then
         Working:=false
       else
       if wParam = Atom_Close then
         Finished:=true;
      end;
   else
     Result := DefWindowProc(hWnd, Msg, wParam, lParam);    // Default result if nothing happens
 end;
end;

Function CreateHotKeyWnd:HWND;
var
 h_Instance : HINST;
 wndClass : TWndClass;
begin
 h_Instance := GetModuleHandle(nil);
 ZeroMemory(@wndClass, SizeOf(wndClass));

 with wndClass do
 begin
   style         := CS_OWNDC ;
   lpfnWndProc   := @WndProc;        // Set the window procedure to our func WndProc
   hInstance     := h_Instance;
   hCursor       := LoadCursor(0, IDC_ARROW);
   lpszClassName := 'InvertMouseWindowClass';
 end;

 Windows.RegisterClass(wndClass);

 Result:=CreateWindow('InvertMouseWindowClass','Invert Mouse',WS_BORDER,0,0,0,0,0,0,h_Instance,0);
end;

begin
 Sleep_Time:=StrToInt(ParamStr(1));
 WND:=CreateHotKeyWnd;
 Atom_Start:=GlobalAddAtom('Hot Key Start Inverting');
 Atom_Stop:=GlobalAddAtom('Hot Key Stop Inverting');
 Atom_Close:=GlobalAddAtom('Hot Key Close Program');
 RegisterHotKey(WND,Atom_Start,MOD_ALT,VK_F11);
 RegisterHotKey(WND,Atom_Stop,MOD_ALT,VK_F12);
 RegisterHotKey(WND,Atom_Close,MOD_ALT,VK_F9);
 LastTime:=GetTickCount;

 while not finished do
 begin
   if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then begin
     if (msg.message = WM_QUIT) then
       finished := True
     else begin
      TranslateMessage(msg);
       DispatchMessage(msg);
     end;
   end;
   DelayTime:=GetTickCount()-LastTime;
   LastTime:=GetTickCount();
   if Delaytime<Sleep_Time then
     Sleep(Sleep_time-Delaytime);
   if Working then begin
     GetCursorPos(NewMousePos);
     NewMousePos.Y:=MousePos.Y-(NewMousePos.Y-MousePos.Y);
     SetCursorPos(NewMousePos.X,NewMousePos.Y);
     MousePos:=NewMousePos;
   end;
 end;                                    

 GlobalDeleteAtom(Atom_Start);
 GlobalDeleteAtom(Atom_Stop);
 GlobalDeleteAtom(Atom_Close);
 Destr
oyWindow(WND);
end.


@!!ex   (2007-08-27 22:22:00) [10]

Самый просто способ - включить VSync, чтобы точно знать максимальное FPS, которое выдает игра(Оно при включенном VSync равно частоте моника), и напистаь прогу, которая с частотой в два раза превышающей максимальный фпс будет тестить положение мыши, и если она сместилась - инвертировать движение.


HF-Trade   (2007-08-27 22:14:00) [11]

Дык кто нить подскажет по существу то?
Игра - Хроники Тарр - космосимулятор. - Всегда играл в такие - X-Tension(The Threat,X3-Reunion и т.п.), а наши сделали и чета намудрили.
Диск есессно скачал с инета, поставил Демантулсой, все норм  - инверта нема(( Вроде как и патчи они уже стяпают, тока народ пишет что после патчей ваще играть никак низя. Да и после патчей уже старфорс обламывает - грит диск не тот))
Вообщем вот так.

> Anatoly Podgoretsky ©   (27.08.07 18:25) [8]
> > Юрий Зотов  (27.08.2007 18:14:07)  [7]
>
> Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет,
>  так и свихнуться можно.

Во первых по Y надо, а не по X. А во вторых если надо поизуверствовать мона намного проще написать - кнопочки чтоб там менялись местами и т.п. Нафига такй гемор с инвертом в данном случае ума не приложу...


> TUser

Дык енто кнопочки=)) А тут именно иверт движения)


DeadMeat   (2007-08-27 20:21:00) [12]

Всю жизнь пользуюсь во всех 3D приложениях, где не видно курсора инвертированной мышкой. И очень страдаю, когда онной "фичи" нету. И перестраиваться с одного "недоделанного" приложения на другое "нормальное" не очень то и легко. Среди пользователей (ИМХО) много "инвертеров". Это как бы и не редкость.


@!!ex   (2007-08-27 19:57:00) [13]

> [7] Юрий Зотов ©   (27.08.07 18:14)

не. нормуль. бывают игры с инвертированной мышой.
Например симуляторы какие нить.
Вот куда должен наклоняться нос самолета при движении мыши вперед?
По правилам - вниз, по стандартным привычкам - вверх.
Пот поэтому и делают инвертирование, чтобы геймер мог выбрать.
Лично я никогда не заморачивался, ибо перестройка мозга под инвертированное управление происходит минут за 10, прогу дольше писать.


Daedr   (2007-08-27 18:34:00) [14]


> Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет,
>  так и свихнуться можно.

сразу видно не геймер), вопрос хороший, часто сталкивался с подобной проблемой, если кто знает подскажите)


Bora.ru   (2007-08-27 18:27:00) [15]

Шаг вперед -> два шага назад
и наоборот


Anatoly Podgoretsky   (2007-08-27 18:25:00) [16]

> Юрий Зотов  (27.08.2007 18:14:07)  [7]

Тем более по оси Х, двигаешь мышку вверх, а она вниз ползет, так и свихнуться можно.


Юрий Зотов   (2007-08-27 18:14:00) [17]

> HF-Trade ©   (27.08.07 17:35) [4]

Инвертированные кнопки - это понятно. Для левшей.

А инвертация движения - я, вроде как, тоже не первый месяц мышку гоняю, но о таком даже и не слышал ни разу.

Что-то тут не то...
:о)


wp2   (2007-08-27 18:00:00) [18]

>Играю в игрушку одну - там нет инвертации мыши. А я уж 100 лет как тока на инвертированной... - привык с ней...

Descent?


TUser   (2007-08-27 17:43:00) [19]

Хм, может Панель управления - Мышь - Для левшей?

:)


HF-Trade   (2007-08-27 17:35:00) [20]

Нет, тупо двинуть мышу эт не нуна.

> Юрий Зотов ©

Играю в игрушку одну - там нет инвертации мыши. А я уж 100 лет как тока на инвертированной... - привык с ней...


Страницы:   1 2

Наверх

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