Я пытаюсь вызвать SendMessage с параметром uint из Java, но не могу преобразовать int в uint. Я не могу изменить параметр uint в SendMessage, потому что это функция Windows. Есть ли способ сделать это?
Справочная информация:
Я на самом деле использую Обработка, и я следую следующие учебники для доступа к user32.dll: http://processing.org/hacks/hacks:jnative
и http://jnative.free.fr/SPIP-v1-8-3/article.php3?id_article=8
И я слежу за этим, чтобы вызвать SendMessage
http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx
Вот мой код, GetActiveWindow работает нормально, это из второй ссылки выше.
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);
Последняя строка, где происходит ошибка, говорит, что ожидаемое значение UINT типа User32 не применимо к LONG I. Я не могу изменить SendMessage либо
Вот соответствующий java-файл, который вызывает вышеуказанный вызов, часть GetActiveWindow работает нормально, так как она из учебника. Я пытаюсь настроить Sendmessage, чтобы следовать этому, но я еще не все понял. Тем не менее, я не думаю, что это имеет значение для ошибки, которую я получаю, поскольку изменение параметров на SendMessage здесь не меняет того, что ожидает компилятор. Я попытался изменить int Msg на uint Msg на long Msg, компилятор все еще ожидает uint из приведенного выше кода.
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);
}