Я пытаюсь вызвать SendMessage с параметром uint из Java, но я не могу преобразовать int в uint. Я не могу изменить параметр uint в SendMessage, потому что это функция windows. Есть ли способ сделать это?Как передать uint в Java?
фона: Я на самом деле с помощью обработки, и я отслеживаю следующие обучающие программы, чтобы получить доступ к 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 я предоставил. Я не могу изменить SendMessage либо
Вот соответствующий java-файл, вызываемый вызовом выше, часть GetActiveWindow отлично работает, так как это из учебника. Я пытаюсь настроить Sendmessage, чтобы следовать за ним, но я еще не понял все это. Тем не менее, я не думаю, что это имеет значение для ошибки, которую я получаю, поскольку изменение параметров в SendMessage здесь не меняет того, что ожидает компилятор. Я попытался изменить int Msg на uint Msg на длинный 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);
}
Ничего себе, спасибо! Мое высшее образование в CompE состояло только из программирования на C, поэтому весь этот материал ООП меня смущает. Но даже в этом случае проблема заключалась в том, что я использовал '(UINT) WM_SYSCOMMAND' вместо 'new UINT (WM_SYSCOMMAND);' что имело значение. Я все еще изучаю разницу между ними, но еще раз спасибо! Если позволите, я бы дважды проголосовал бы за вас. Но пока у меня только 11 очков, я даже не могу голосовать за вас. – omikun
Рад, что вы нашли это полезным. Вы можете отметить это как ответ, и это тоже стоит того. BTW, не совсем уверен, что я назвал бы это проблемой ООП. Между Java и C существует несоответствие, и автор JNative попытался придумать умный способ справиться с этой разницей. – jdigital