Dobrý den, potřeboval bych poradit jak změnit směr pohybu myši. Tzn. například převrátit směry - pohyb nahoru, myš se pohybuje dolů atd.
Děkuju za pomoc
Myš je hlodavec, případně vstupní zařízení, takže použitím návnady případně opačným pohybem ruky.
Nebo myslíš kurzor? Systémový nebo vlastní? Na co takovou blbost vůbec potřebuješ? Trošku to rozveď.
Pár linků pro inspiraci (předpokládám že to je pro win):
http://msdn.microsoft.com/…s.85%29.aspx
http://msdn.microsoft.com/…s.85%29.aspx
V tom případě máš alespoň část řešení v těch odkazech. RawInput použít na odchyt pohybu myšky a pomocí SendInput pak poslat kurzor na opačnou stranu. Asi bude problém v tom, zabránit systému v původním pohybu, ale nemíním to teď zkoušet. Až budeš něco mít tak možná popojedem.
Prvotní řešení, u mě to funguje. Je to dělaný v okně protože je ho potřeba na záchyt a zpracování WM_INPUT, ale pokud nechceš okenní aplikaci tak se to dá obejít pomocí AllocateHWND. Tady je kód:
unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,
WinRawInput;
type
TfMainForm = class(TForm)
tmrOffTimer: TTimer;
procedure FormCreate(Sender: TObject);
procedure tmrOffTimerTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnRawInput(var Msg: TMessage); message WM_INPUT;
procedure ProcessMouseInput(Mouse: TRawMouse);
end;
var
fMainForm: TfMainForm;
implementation
{$R *.dfm}
procedure TfMainForm.OnRawInput(var Msg: TMessage);
var
RawInputSize: LongWord;
RawInput: PRawInput;
begin
GetRawInputData(HRAWINPUT(Msg.lParam),RID_INPUT,nil,@RawInputSize,SizeOf(TRawInputHeader));
If RawInputSize > 0 then
begin
RawInput := AllocMem(RawInputSize);
try
If GetRawInputData(HRAWINPUT(Msg.lParam),RID_INPUT,RawInput,@RawInputSize,SizeOf(TRawInputHeader)) = RawInputSize then
case RawInput^.header.dwType of
RIM_TYPEMOUSE: ProcessMouseInput(RawInput^.mouse);
RIM_TYPEKEYBOARD:;
RIM_TYPEHID:;
end;
finally
FreeMem(RawInput,RawInputSize);
end;
end;
end;
procedure TfMainForm.ProcessMouseInput(Mouse: TRawMouse);
var
SimInput: TInput;
begin
If ((Mouse.lLastX <> 0) or (Mouse.lLastY <> 0)) and (Mouse.ulExtraInformation <> DWORD(-1)) then
begin
FillChar(SimInput,SizeOf(SimInput),0);
SimInput.Itype := INPUT_MOUSE;
SimInput.mi.dx := -2 * Mouse.lLastX;
SimInput.mi.dy := -2 * Mouse.lLastY;
SimInput.mi.dwFlags := MOUSEEVENTF_MOVE;
SimInput.mi.dwExtraInfo := DWORD(-1);
SendInput(1,SimInput,SizeOf(SimInput));
end;
end;
procedure TfMainForm.FormCreate(Sender: TObject);
var
RawInputDevice: PRawInputDevice;
begin
New(RawInputDevice);
try
RawInputDevice^.usUsagePage := $01;
RawInputDevice^.usUsage := $02; //mouse
RawInputDevice^.dwFlags := RIDEV_INPUTSINK;
RawInputDevice^.hwndTarget := Handle;
If not RegisterRawInputDevices(RawInputDevice,1,SizeOf(TRawInputDevice)) then
raise Exception.Create('Raw input registration failed.');
finally
Dispose(RawInputDevice);
end;
end;
procedure TfMainForm.tmrOffTimerTimer(Sender: TObject);
begin
close;
end;
end.
WinRawInput je moje unita, tak ji kdyžtak vymaž - mám ji tam protože moje delphi (7) podle všeho nemaj nikde věci potřebný pro RawInput, v novějších už to snad je. Timer tam je pro jistotu - automaticky to vypne kdyby něco.
Takže se tu bavíme o potenciální poruše hardwaru? Trochu špatná sekce fóra ne?
Jináč možnost otočit osy tu pochopitelně je, takže být tebou podívám se do nastavení systému a případně ovládací aplikace pokud nějaká je. A samozřejmě do manuálu daného zařízení. Víc ti neporadím, protože tohle je silně OT a já nejsem žádnej guru.
Uvedomte si, ze zakladni tema je to, co napsal Majlow nahore, chtel zamerne zmenit smer mysi. Pokud resite stale jeho problem a divite se, ze smer mysi je jinak, tak je to zamerne, ne? Pokud jeho problem neresite, pak musite o svem problemu napsat vic, vlastni kod programu, u hw popis, co jste s tim zkouseli. Pokud kdysi zlobila my a jina jela, tak byl problem
- v nespravnem ovladaci (to je celkem logicke, ze mys se spatnym ovladacem nepojede; obvykle je to problem starsich mysi, ovladacu)
- prepnuta mys z rezimu 2 tlacitka na 3 (tak to je celkem logicke, ze pro 2 tlacitkovy rezim se pouziva jina sada ovladacu na starem pc - tuhle zakernost nam delali spoluzaci ve skole)
- ps2 mys nejede, za chodu jsem ji vytahl a zasunul (presne tak se ale ps2 chova, je treba restart pc)
- mate mys skutecne dobre zasunutou ve spravne dire?
- jeste by mohlo byt spatne zapojeni uvnitr pc, ale kdyz jina mys jede, tak je problem jen mys nebo ovladac
Pokud se nejedna o tento problem, ale problem sw, tak je treba kod nebo nazev, pripadne reklamovat u vyrobce sw / mys.
Pozor, u novych pc jsou taky pekne zakernosti. Treba lze otacet display. Cili, co monitor zobrazuje, zobrazovat prevracene nebo otocit o 90 stupnu. Lze otacet i monitor a on se pak bud prizpusobi sam a prevrati displej nebo je treba to udelat rucne. Tusim je na to klavesova zkratka ctrl+shift+sipka(nahoru, dolu,vpravo,vlevo). Tusim jde dokonce u win primo nastavi, ze mys jde obracene. (ma to sve vyhody, uz jsem toho parkrat vyuzil k prospechu, ale bezneho uzivatele to vyleka, kdyz si omylem pres klavesnici prehodi zobrazovani monitoru opacne)
Take existuje dualni rezim, dva displeje, kde lze nastavit, ze smerem doprava pres okraj se prejde na druhy. Jenze, kdyz je druhy monitor vlevo a ne vpravo, tak je to takove divne :)
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku