我正在尝试使用Java中的uint参数调用SendMessage,但我无法将int转换为uint。我无法更改SendMessage中的uint参数,因为它是一个Windows函数。有没有办法做到这一点?
背景: 我实际上正在使用Processing,我正在按照以下教程访问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);
最后一行是发生错误的地方,它表示User32类型中的预期UINT不适用于我提供的LONG。我无法修改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);
}
答案 0 :(得分:3)
从数据的角度来看,uint和int是同一个东西 - 一个32位的值。唯一的区别是操作码如何解释最高位。在Java和C之间传递时,您只需传递32位,因此符号无关紧要。解决方案是将uint参数声明为int。
BTW,unsigned / signed的问题在这里并不重要,因为SendMessage的uMsg值对所有Microsoft消息都是正的,对于这个问题,很可能对你可能遇到的任何其他事情都是正面的。答案 1 :(得分:1)
如果您使用的是org.xvolks.jnative包,则所有参数(HWND,UINT,WPARAM和LPARAM)都是org.xvolks.jnative.misc.basicStructures中的类。所以你应该可以做这样的事情(未经测试的代码):
import org.xvolks.jnative.misc.basicStructures.*;
...
User32.SendMessage(
new HWND(ValidHWND),
new UINT(WM_SYSCOMMAND),
new WPARAM(SC_MONITORPOWER),
new LPARAM(MONITOR_STANDBY);
供您参考,这里是org.xvolks.jnative.util.User32中SendMessage的实现。如您所见,jnative代码根本不关心有符号和无符号。您可能会发现抓住jnative source code。
非常有用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);
}
如果您认为自己不喜欢JNative,可以查看Java Native Access (JNA)。
答案 2 :(得分:-1)
由于Java没有无符号类型的概念,因此必须使用long来表示unsigned int。请查看this site以获取有关如何执行此操作的示例。