Avatar billede fbisen Nybegynder
10. april 2009 - 14:41 Der er 4 kommentarer og
1 løsning

Se hvilket ikom musen har

Hej Eksperter

Nu har jeg i længere tid ledt lidt efter et stykke kode som kan tjekke om et specielt ikon bliver brugt til musen lige nu.

Jeg har kun brug for at tjekke ikonet på Windows, men det er ikke en Windows standard ikon.

Jeg har brugt GetCursorInfo ( http://msdn.microsoft.com/en-us/library/ms648389(VS.85).aspx ) for at få fat på et handle til musen.
Handles har det med at ændre sig, og derfor kan jeg ikke bruge denne værdi til at se om det er mit specifikke ikon der bruges, da værdien bliver ændret når programmet genstartes. Efter at have fået fat i handlet bruger jeg GetIconInfo ( http://msdn.microsoft.com/en-us/library/ms648070(VS.85).aspx ), som får dette handle med til at få nogle flere information er om ikonet.

Her får jeg hBMMask, men dette ændrer sig også hele tiden, selvom ikonet er det samme. hBMColor er i programmet altid 0.

Jeg har ikke et program i C/C++ da jeg bruger AutoHotKey til at lave alt dette. Koden for AutoHotKey er følgende:

Loop
{
    Sleep 1000
    VarSetCapacity(mi, 20, 0)
    mi := Chr(20)
    DllCall("GetCursorInfo", "Uint", &mi)
    bShow  := NumGet(mi, 4)
    hCursor := NumGet(mi, 8)
    xCursor := NumGet(mi,12)
    yCursor := NumGet(mi,16)

    VarSetCapacity(ni, 20, 0)   
    DllCall("GetIconInfo", "Uint", hCursor, "Uint", ∋)
    fIcon := NumGet(ni, 0)
    xHotspot := NumGet(ni, 4)
    yHotspot := NumGet(ni, 8)
    hBMMask  := NumGet(ni,12)
    hBMColor := NumGet(ni,16)
   
    TrayTip, test, bShow = %bShow%`nhCursor = %hCursor%`nxCursor = %xCursor%`nyCursor = %yCursor%`nfIcon = %fIcon%`nxHotspot = %xHotspot%`nyHotspot = %yHotspot%`nhBMMask = %hBMMask%`nhBMColor = %hBMColor%, 10
}

Jeg tænker om man kan bruge handlet til BMMask (det jeg har kaldt hBMMask) til at få noget at vide om det billede der bruges til musens ikon?

Jeg regner med dette er svært, da ikke mange har brug for at tjekke hvilket ikon der bliver brugt på musen. Jeg håber dog en af Jer eksperter har prøvet dette eller måske har mere erfaring med MSDN.

Hvis muligt vil jeg helst have kode i AutoHotKey syntax, men C++ syntax kan jeg også bruge.

Jeg håber på støtte :)
Avatar billede bertelbrander Novice
10. april 2009 - 23:46 #1
Har du overvejet at bruge GetIconInfoEx:
http://msdn.microsoft.com/en-us/library/ms648071(VS.85).aspx
Den giver lidt flere informationer.

Hvordan kan/vil du checke hvilket ikon der bliver brugt?

Blot af nysgerrighed, hvorfor vil du checke hvilket ikon der bliver brugt?
Avatar billede fbisen Nybegynder
12. april 2009 - 17:32 #2
Det har jeg overvejet og prøvet, uden held. Jeg har prøvet følgende kode i AutoHotKey, hvor alle værdier er 0 eller "", undtagen cbSize som er 546.

Loop
{
    Sleep 1000
    VarSetCapacity(mi, 20, 0)
    mi := Chr(20)
    DllCall("GetCursorInfo", "Uint", &mi)
    bShow  := NumGet(mi, 4)
    hCursor := NumGet(mi, 8)
    xCursor := NumGet(mi,12)
    yCursor := NumGet(mi,16)

    VarSetCapacity(ni, 546, 0)
    NumPut(546, ni)
    DllCall("GetIconInfoEx", "Uint", hCursor, "Uint", &ni)
    cbSize := NumGet(ni, 0)
    fIcon := NumGet(ni, 4)
    xHotspot := NumGet(ni, 8)
    yHotspot := NumGet(ni, 12)
    hBMMask  := NumGet(ni,16)
    hBMColor := NumGet(ni,20)
    VarSetCapacity(szModName, 260)
    VarSetCapacity(szResName, 260)
    wResID := NumGet(ni,24,"Ushort")
    DllCall("RtlMoveMemory", "str", szModName, "Uint", &ni+ 26, "Uint", 260)
    DllCall("RtlMoveMemory", "str", szResName, "Uint", &ni+286, "Uint", 260)
   
    TrayTip, test, bShow = %bShow%`nhCursor = %hCursor%`nxCursor = %xCursor%`nyCursor = %yCursor%`ncbSize = %cbSize%`nfIcon = %fIcon%`nxHotspot = %xHotspot%`nyHotspot = %yHotspot%`nhBMMask = %hBMMask%`nhBMColor = %hBMColor%`nwResID = %wResID%`nszModName = %szModName%`nszResName = %szResName%`nA_Cursor = %A_Cursor%, 10
}

Jeg har brugt handlet til at tjekke om et ikon er specifikt, men det kræver at man først angiver handlet, som jo ændrer sig, hver gang. Det er langtfra optimalt. Min anden ide er om man kunne bruge handlet til bitmappet for ikonet til at tjekke om det havde nogen speciel værdi.

Jer er igang med at lave et lille makroscript som skal åbne et MMORPG spil og automatisk logge ind. Jeg vil her flytte musen rundt indtil jeg finder username feltet som laver en speciel musemakør.
Avatar billede bertelbrander Novice
12. april 2009 - 20:17 #3
Var det ikke lettere at finde handlen til vinduet, og gennem den vinduets placering?
Avatar billede fbisen Nybegynder
13. april 2009 - 11:22 #4
Det kan jeg nemt finde. Og jeg kan også løse problemet på den måde. Men der kan komme mange små-problemer i det (skærmstørelse, fullscreen) og derfor ville jeg prøve med musen.

Jeg tænker at det må være muligt at få musens icon, og hvis man kan det, må det også være muligt at tjekke hvilket musseikon der bliver brugt.

Det er i hvert fald denne løsning jeg gerne vil bruge, da den også kan bruges ved andre mindre små-problemer jeg skal løse for at logge ind.
Avatar billede fbisen Nybegynder
22. august 2010 - 10:24 #5
Det har ikke været muligt at få et svar til dette. Tak for forsøget bertelbrander. Jeg har på fornemmelsen at problemet er at Windows ikke husker fillokationen på musens curser, men kun hvordan den ser ud. Hvis fillokationen var til at få fat i, ville det være en smal sag at tjekke hvilket ikon der blev brugt.

Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester