Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Predne JNA neni knihovna, je to obecne rozhrani z Javy do nativniho kodu. Takze muzes treba volat fu…
MaSo 09.03.2018 09:01
MaSo
Ano, máš pravdu, ztratím univerzálnost, ale kvůli jedné věci ji nebudu psát v jiném jazyku. Každopá…
MichalDM 10.03.2018 14:05
MichalDM
Už to funguje. interface User32 extends com.sun.jna.platform.win32.User32 { User32 INSTANCE = (Use…
MichalDM 14.03.2018 19:20
MichalDM
WinAPI zrejme konzumuje jen hexa promenne, vsak koukni do dokumentace. Ty SPIF_ jsou flagy. Dalsi ne…
MaSo 15.03.2018 12:30
MaSo
WinAPI konzumuje čísla. Či sú zapísané v desiatkovej alebo šestnástkovej sústave je jedno, pretože k…
los 15.03.2018 14:26
los
JÁ JSEM VŮL. ŘEŠÍM TADY RYCHLOST MYŠI A ŘEŠENÍ JE ÚPLNĚ PRIMITIVNÍ. Abych začal od začátku, mám "ta…
MichalDM 15.03.2018 23:32
MichalDM
Je to pomale? Pada to na OutOfMemmory? Jestli ne, tak to neres prosimte...
MaSo 16.03.2018 08:43
MaSo
OK. Díky. poslední
MichalDM 16.03.2018 20:19
MichalDM

Predne JNA neni knihovna, je to obecne rozhrani z Javy do nativniho kodu. Takze muzes treba volat funkce z WinAPI nebo z nejakych dll knihoven. Osobne jsem to pouzil jen jednou, ale ne na WinAPI - coz potrebujes ty. Zkus googlit.

PS: Nedelej to. Prijdes o multiplatformost aplikace. Pak se nabizi otazka proc to vubec psat v Jave, kdyz treba .NET bys tohle udelal daleko snaze.

Ano, máš pravdu, ztratím univerzálnost, ale kvůli jedné věci ji nebudu psát v jiném jazyku.

Každopádně, hledal jsem to a našel tyto dva odkazy.

jna-systemparametersinfo-to-set-mouse-speed-is-returning-false-not-changing
java-awt-robot-changes-windows-mouse-speed

Zkusil jsem to nějak sepsat, ale nefunguje to.



import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinGDI;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;

interface User32 extends com.sun.jna.platform.win32.User32 {

    User32 INSTANCE = (User32) Native.loadLibrary(User32.class,
            W32APIOptions.DEFAULT_OPTIONS);

    boolean SystemParametersInfo(
            int uiAction,
            int uiParam,
            Object pvParam, // Pointer or int
            int fWinIni
    );
}

public class Options extends javafx.application.Application implements User32 {

    private static final int SPI_GETMOUSESPEED = 0x70;
    private static final int SPI_SETMOUSESPEED = 0x071;
    private static final int SPIF_UPDATEINIFILE = 0x01;
    private static final int SPIF_SENDCHANGE = 0x02;
    private static final int SPIF_SENDWININICHANGE = 0x02;

    @Override
    public void start(javafx.stage.Stage stage) {
       // kód
    }

    public static void main(String[] args) {
        User32.INSTANCE.SystemParametersInfo(SPI_SETMOUSESPEED, 0,
                Pointer.createConstant(2),
                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);
        launch(args);
    }

Prosím Vás o radu.

Děkuji

PS. Variable SPI_GETMOUSESPEED není vůbec použita a program chtěl po přidání rozhraní importovat miliardu abstractních method.

Už to funguje.



interface User32 extends com.sun.jna.platform.win32.User32 {

    User32 INSTANCE = (User32) Native.loadLibrary(User32.class, W32APIOptions.DEFAULT_OPTIONS);

    boolean SystemParametersInfo(
            int uiAction,
            int uiParam,
            Pointer pvParam,
            int fWinIni
    );
}

public class Options extends javafx.application.Application implements User32 {

    private static final int SPI_SETMOUSESPEED = 0x0071;
    private static final int SPIF_UPDATEINIFILE = 0x01;
    private static final int SPIF_SENDCHANGE = 0x02;
    private static final int SPIF_SENDWININICHANGE = 0x02;

    @Override
    public void start(javafx.stage.Stage stage) {
       // kód
    }

    public static void main(String[] args) {
        User32.INSTANCE.SystemParametersInfo(SPI_SETMOUSESPEED, 0,
                Pointer.createConstant(2),
                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);
        launch(args);
    }
}

Je tam však jeden malý zádrhel. Jelikož to mění přímo ve WIN, tak to zůstane i po skončení aplikace. Samozřejmě to lze změnit zpět pomocí metody,


    @Override
    public void stop() throws Exception {
        User32.INSTANCE.SystemParametersInfo(SPI_SETMOUSESPEED, 0,
                Pointer.createConstant(2),
                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE | SPIF_SENDWININICHANGE);
    }

která se vždy zavolá po skončení aplikace. Ovšem netuším, co tam mám nastavit za hodnoty. A s tím taky souvisí to, jestli je nutné to uvádět v jiné, než desítkové soustavě?

Prosím Vás o radu.

Díky.

WinAPI konzumuje čísla. Či sú zapísané v desiatkovej alebo šestnástkovej sústave je jedno, pretože kompilátor z toho spraví rovnaké jednotky a nuly. Konvencia je používať šestnástkovú sústavu najmä kvôli čitateľnosti, keďže väčšinou sú tie čísla flagy.

Meniť rýchlosť myši z nejakej okienkovej aplikácie nie je ani zďaleka dobrý nápad. Dôvodov "prečo" je veľa, nekorektné ukončenie aplikácie je len jedným z mnohých. Odporúčam zamyslieť sa nad iným riešením, ale nesledoval som staršie príspevky, takže neviem, aký problém autor vlastne rieši.

JÁ JSEM VŮL. ŘEŠÍM TADY RYCHLOST MYŠI A ŘEŠENÍ JE ÚPLNĚ PRIMITIVNÍ.

Abych začal od začátku, mám "tabulku" polygonů, "na něm" je další "tabulka" polygonů. Nejsou to přímo jeho potomci, ale jsou o vrstvu výše.

Respektive, mám polygon A, polygon B (čistě příklad)

Najedu na A, zobrazí se polygony na něm.
Přejedu na vedlejší polygon B, zobrazí se polygony na něm a zároveň polygony na A zmizí.
Přejedu zpátky na polygon A, zobrazí se polygony na něm a zároveň polygony na B zmizí.

Když jsem to dělal pomocí visible, fungovalo to bez problém. Pak jsem to ale předělal na FadeTransition, které postupně naskládám do ParallelTransition a pustím je.
Avšak po rychlém přejetí přes několik prvků animace nefungovala správně, některé prvky se nezobrazily a některé naopak zase nezmizely. Ovšem, když jsem přejížděl pomalu, pouze na sousední a potom, co současná animace proběhla, fungovalo to bez problému.

Problém byl v tom, že objekt ParallelTransition byl statický field třídy, který se vždy po najetí na nový polygon vymazal, což pravděpodobně působilo tyto problémy, když ještě předešlá animace neskončila.

Řešení bylo prosté, stačilo objekt předělat na dočasnou lokální proměnnou. Nastává však fakt, že když budu neustále vytvářet a mazat proměnnou, tak vzniká režie. Právě proto jsem to měl jako statický field.

Lze to nějak, prosím Vás, obejít. Respektive, nějaké optimálnější řešení.

Díky

Zpět do poradny Odpovědět na původní otázku Nahoru