[WinAPI/C++] Låsa mus i fönster

Permalänk
Medlem

[WinAPI/C++] Låsa mus i fönster

Nu kanske ni tänker på CaptureMouse(), och det låter ju väldigt bra. Men jag vill låsa musen i ett annat fönster, nämligen Warcraft 3-fönstret då den inte gör det själv om man kör i fönsterläge. Den funktionen tillåter inte att man låser musen i fönster som tillhör en annan process.
Det vill jag åstakomma.

Har nu tänkt lite olika lösningar, men hittar inte rätt funktioner att använda mig av.

1. Hela tiden kolla positionen, och sedan flytta musen om den råkar hamna utanför fönstret.

2. Kopiera in en funktion i warcraft-processen som kör CaptureMouse(). Detta kanske b-net klagar på då man mixtrar med koden, vad vet jag.

3. Köra en hook som gör samma sak, men bara då musen flyttas. Detta lär vara det bästa, men har inte förstått det med hooks heller.

Alla sätt borde fungera bra till mitt ändamål, men det va länge sen jag höll på med C++ så ni får gärna leda mig rätt vad som borde fungera bäst. Eller om det kanske rent av finns något program som gör detta.

Permalänk
Medlem

Antar att du menar SetCapture()?

Problemet är ju att den opererar på trådnivå och inte processnivå, och därför räcker det inte att den andra processen kör den, utan den tråden som äger fönstret måste köra den.
Hade det varit på processnivå så hade ju man enkelt löst det med CreateRemoteThread(), men blir mycket svårare på trådnivå. Antingen kan du ju under runtime trixa till så att den kör rätt funktion (modifiera EIP och stepa lite, väldigt jobbigt .. och räknas möjligen som fusk). Eller så får du hooka IAT:n så att den funtkionen anropas automatiskt när en annan funktion körs.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Sorry för offtopic.. men hur får man warcraft 3 att köras i ett fönster?

Permalänk
Medlem

Du kan ju alltid använda funktionen SetCursorPos, som sätter pekaren var du vill på skärmen.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Glömsk

Nu var det ett tag sedan jag rörde Win32 men det här borde vara mycket enkelt fixat med en global mushook. Typ

HHOOK hook; LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { // kolla efter WM_MOUSEMOVE i wParam och MSLLHOOKSTRUCT::pt i lParam // om pt är utanför fönstret så returnera inte nästa hook i kedjan. return CallNextHookEx(hook, nCode, wParam, lParam); } ... h_hHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), 0); ... UnhookWindowsHookEx(hook);

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av robino_
Sorry för offtopic.. men hur får man warcraft 3 att köras i ett fönster?

Parametern -window

Citat:

Ursprungligen inskrivet av jdv
Du kan ju alltid använda funktionen SetCursorPos, som sätter pekaren var du vill på skärmen.

Ahh, så va det den hette. Tack.

MagnusL: Givetvis menade jag SetCapture()

Psionicist: Är det så enkelt? [testar]

Har nu testat det, men förstår inte ett skvatt. Kör jag med WH_MOUSE_LL så börjar musen reagera dåligt. Testade att ändra till WH_MOUSE, då reagerade den normalt. I båda fallen så verkade den inte bry sig om vad jag skrev i funktionen.

Permalänk
Medlem

I C# .NET kan du göra såhär, antar att det är ganska likt i C++.NET

if (Cursor.Position.X > 300) Cursor.Position = new Point(300, Cursor.Position.Y);

Lägg skiten i en while-slinga som körs hela tiden, byt ut 300 mot warcrafts fönsterposition och lägg till alla andra sidor av fönstret så borde det fungera.
Vet dock inte hur bra det fungerar när du kör directx-spel :/

Permalänk

Kan inte påstå att jag förstår precis vad du vill men det låter som ClipCursor skulle kunna hjälpa.

Visa signatur

Jag ser så dåligt när jag blundar. Jag ser nästan...nästan ingenting alls.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Slashdotcom
Kan inte påstå att jag förstår precis vad du vill men det låter som ClipCursor skulle kunna hjälpa.

Ahh, perfekt!

Det jag vill åstakomma (precis som ClipCursor gör) är att begränsa musrörelserna i ett visst fönster. Warcraft 3 gör inte detta, så när man försöker scrolla med musen så åker den alltid utanför fönstret. Inte så bra. Speciellt inte då den ibland råkar "hoppa över" de pixlarna som gör att det scrollas.

Nåja, jättetack allihopa!
Om någon är nyfiken:

while (true) { while (true) { hwnd = FindWindow(NULL, title); if (hwnd) break; Sleep(1000); } while (true) { hwnd = FindWindow(NULL, title); if (!hwnd) { ClipCursor(NULL); break; } if (hwnd == GetForegroundWindow()) { RECT rect; GetWindowRect(hwnd, &rect); rect.left += 5; rect.right -= 5; rect.top += 31; rect.bottom -= 5; ClipCursor(&rect); } else { ClipCursor(NULL); } Sleep(500); } }

Permalänk
Medlem

Jag är ledsen för att behöva dra upp en såhär gammal tråd, men skulle någon kunna kompilera den till en binär?

Tack på förhand.

Permalänk