Frage

Ich versuche Sendmessage mit einem uint Parameter von Java zu nennen, aber ich kann nicht int konvertieren in uint. Ich kann nicht den uint Parameter in Sendmessage ändern, da es sich um eine Windows-Funktion ist. Gibt es eine Möglichkeit, dies zu tun?

Hintergrund: Ich bin Verarbeitung tatsächlich verwendet wird, und ich bin nach den folgenden Anleitungen für den Zugriff user32.dll: http: / /processing.org/hacks/hacks:jnative

und http://jnative.free. fr / SPIP-v1-8-3 / article.php3? id_article = 8

Und ich bin im Anschluss an diese Sendmessage aufrufen http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx

Hier ist mein Code, GetActiveWindow funktioniert gut, es ist aus dem zweiten Link oben.

 int SC_MONITORPOWER = 0xF170;
 int WM_SYSCOMMAND = 0x0112;
 int MONITOR_ON = -1;
 int MONITOR_OFF = 2;
 int MONITOR_STANDBY = 1;

HWND ValidHWND = org.xvolks.jnative.util.User32.GetActiveWindow(); 
org.xvolks.jnative.util.User32.SendMessage(ValidHWND, (UINT)WM_SYSCOMMAND, 
          (WPARAM)SC_MONITORPOWER, (LPARAM)MONITOR_STANDBY);

letzte Zeile ist, wo der Fehler passiert, sagt es die erwartete UINT in Art User32 auf die LONG nicht anwendbar ist I zur Verfügung gestellt. Ich kann es nicht ändern Sendmessage entweder

Hier ist die entsprechende Java-Datei der Anruf über aufruft, der GetActiveWindow Teil funktioniert gut, da es aus einem Tutorial ist. Ich versuche Sendmessage zuzuzuschneiden, ihn zu folgen, aber ich habe nicht alles aus noch dache. Aber ich glaube nicht, es zu dem Fehler zählt, ich bin immer, da die Parameter zu ändern, hier zu Sendmessage nicht ändert, was der Compiler erwartet. Ich habe int Msg versucht Ändern Msg zu lange Msg in uint, der Compiler noch uint aus dem Code erwartet oben.

public class Paul_s_User32 extends User32 {
public HANDLE GetActiveWindow() {
    JNative GetActiveWindow = new JNative(DLL_NAME, "GetActiveWindow");
    GetActiveWindow.setRetVal(Type.INT);
    GetActiveWindow.invoke();
    HWND handle = new HWND(GetActiveWindow.getRetValAsInt());
    GetActiveWindow.dispose();
    return handle;
}
public IntPtr SendMessage(IntPtr hWnd, int Msg, 
          IntPtr wParam, IntPtr lParam) {
    JNative SendMessage = new JNative(DLL_NAME, "SendMessage");
    //SendMessage.setRetVal(Type.long);
    SendMessage.invoke();

    SendMessage(ValidHWND, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_STANDBY);
}
War es hilfreich?

Lösung

Wenn Sie das org.xvolks.jnative Paket verwenden, alle Parameter (HWND, UINT, WPARAM und LPARAM) sind Klassen in org.xvolks.jnative.misc.basicStructures. So sollten Sie in der Lage sein, so etwas wie dieser (ungetestet Code) zu tun:

import org.xvolks.jnative.misc.basicStructures.*;
...

User32.SendMessage(
    new HWND(ValidHWND),
    new UINT(WM_SYSCOMMAND), 
    new WPARAM(SC_MONITORPOWER),
    new LPARAM(MONITOR_STANDBY);

Für Ihre Referenz, hier ist die Umsetzung von Sendmessage in org.xvolks.jnative.util.User32. Wie Sie sehen können, wird der jnative Code überhaupt nicht kümmert sich um und ohne Vorzeichen. Man könnte es nützlich finden Sie die jnative Quellcode zu greifen.

public static LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) throws NativeException, IllegalAccessException
{
    JNative SendMessage = new JNative(DLL_NAME, "SendMessageA");
    SendMessage.setRetVal(Type.INT);
    int pos = 0;
    SendMessage.setParameter(pos++, hWnd.getValue());
    SendMessage.setParameter(pos++, Msg.getValue());
    SendMessage.setParameter(pos++, wParam.getValue());
    SendMessage.setParameter(pos++, lParam.getValue());
    SendMessage.invoke();
    pos = SendMessage.getRetValAsInt();
    SendMessage.dispose();
    return new LRESULT(pos);
}

Und wenn Sie sich entscheiden, dass Sie JNative nicht, könnten Sie einen Blick auf Java Native Access nehmen ( JNA) .

Andere Tipps

Aus daten Sicht ein uint und int sind die gleiche Sache - ein 32-Bit-Wert. Der einzige Unterschied ist, wie OP-Codes das oberste Bit interpretieren. Wenn zwischen Java und C vorbei, vorbei sind nur 32 Bits, so dass die Zeichen nicht relevant ist. Die Lösung ist einfach die uint Parameter als int zu deklarieren.

BTW, die Ausgabe von unsigned / unterzeichnet ist nicht signifikant hier, weil der uMsg Wert für Sendmessage positiv ist für alle Microsoft-Nachrichten, und was das betrifft, ist mehr als wahrscheinlich positiv für alles, was Sie wahrscheinlich zu begegnen sind.

Da Java nicht den Begriff der unsigned-Typen haben, müssen Sie eine lange verwenden, um ein unsigned int darzustellen. Prüfen Sie dieser Seite Beispiele dafür, wie dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top