Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

Инвертировать мышь по оси 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.042 c
3-1179737716
Empleado
2007-05-21 12:55
2007.09.23
Постраничная выборка


2-1188116137
Daedr
2007-08-26 12:15
2007.09.23
Чтение из файла


15-1188226793
неискушенный
2007-08-27 18:59
2007.09.23
Просто интересно


2-1188228228
Антон Шестаков
2007-08-27 19:23
2007.09.23
сортировка при заполнении


1-1183993705
Dr. Andrew
2007-07-09 19:08
2007.09.23
Во время показа hints мелькает фоном стандартная подсказка.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский