Da mich das auch nun interessiert hat, habe ich es mal probiert und nach einigem Hin-und-her hinbekommen. Das mit dem HWND war tatsächlich der Knackpunkt... man muss 2x getPointer() aufrufen. Ein anderer war, dass man die ANSI- oder WIDECHAR-Variante der Winapi-Funktion nehmen muss. Habe mich für WIDE entschieden. Sonst kam bei mir immer ein "Funktion nicht gefunden". Ist bei dir aber vielleicht anders, sprich ggfs. mal das "W" am Funktionsnamen weglassen oder durch ein "A" ersetzen.
Von JNA habe ich das neuste vom zuletzt geposteten Link genommen.
Hier mein Code (funktionierte sogar bei Java 7, 64bit JRE, aber auch auf Java 6, 32bit):
[code=Java]
// Die Benennung hier ist kein Musterbeispiel! :)
public final class Test {
public static interface User32 extends Library {
LRESULT SendMessageTimeoutW(HWND handle, long msg, long wp, String lp, long f, long to, DWORD_PTR p);
}
public static interface Kernel32 extends Library {
int GetLastError();
}
private static final int HWND_BROADCAST = 0xffff;
private static final int WM_SETTINGCHANGE = 0x001a;
private static final int SMTO_ABORTIFHUNG = 0x0002;
public static void main(String[] args) {
User32 user32 = (User32) Native.loadLibrary("user32", User32.class);
Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
HWND handle = new HWND(new LongByReference(HWND_BROADCAST).getPointer().getPointer(0));
DWORD_PTR p = new DWORD_PTR(0L);
LRESULT r = user32.SendMessageTimeoutW(handle, WM_SETTINGCHANGE, 0, "Environment", SMTO_ABORTIFHUNG, 5000, p);
System.out.println("DW ptr = " + p.intValue());
System.out.println("Last err = " + kernel32.GetLastError());
System.out.println("lresult = " + r.intValue());
}
}
[/code]