![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Инвертировать мышь по оси Y [D7, WinXP]
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;oyWindow(WND);
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
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 лет как тока на инвертированной... - привык с ней...