Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

Инвертировать мышь по оси Y   Найти похожие ветки 

 
HF-Trade ©   (2007-08-27 04:16) [0]

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


 
Anatoly Podgoretsky ©   (2007-08-27 09:23) [1]

> HF-Trade  (27.08.2007 04:16:00)  [0]

Верный путь довести пользователя до дурдома.


 
Юрий Зотов ©   (2007-08-27 11:03) [2]

> HF-Trade ©   (27.08.07 04:16)  

> подскажите как сделать сабжик?

Если скажете, для чего такой сабжик нужен, то можно и подсказать.


 
wp2 ©   (2007-08-27 11:28) [3]

если тупо: надо узнать координаты миши, и переместить мышь в нужную позицию специальными функциями (такого добра в инете полно)


 
HF-Trade ©   (2007-08-27 17:35) [4]

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

> Юрий Зотов ©

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


 
TUser ©   (2007-08-27 17:43) [5]

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

:)


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

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

Descent?


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

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

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

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

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


 
Anatoly Podgoretsky ©   (2007-08-27 18:25) [8]

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

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


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

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


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


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

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


 
@!!ex ©   (2007-08-27 19:57) [11]

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

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


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

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


 
HF-Trade ©   (2007-08-27 22:14) [13]

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

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

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


> TUser

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


 
@!!ex ©   (2007-08-27 22:22) [14]

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


 
@!!ex ©   (2007-08-27 23:44) [15]

На. Только при запуске нужно указывать как часто проверять позицию мыши. у меня при 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 23:50) [16]

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


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

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


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

После запуска игры, когда мышь зафиксируеться, не двигая мышь, нужно нажать 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.


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

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


 
HF-Trade ©   (2007-08-29 16:24) [20]

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


 
@!!ex ©   (2007-08-29 17:36) [21]

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


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

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


 
HF-Trade ©   (2007-08-30 23:21) [22]


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

На мышЬ=)


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


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


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

> На мышЬ=)

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
15-1187921953
Slider007
2007-08-24 06:19
2007.09.23
С днем рождения ! 24 августа 2007 пятница


2-1188290749
Шестаков Антон
2007-08-28 12:45
2007.09.23
программно заполнить combobox


2-1188231741
Ellita
2007-08-27 20:22
2007.09.23
Я хочу чтобы мое ехе-шное окно не меняло размер


11-1171730658
Dy1
2007-02-17 19:44
2007.09.23
"много вопросов, мало ответов" (с)


3-1179737093
barakuda
2007-05-21 12:44
2007.09.23
adotable + excel