题
我试图调用SendMessage函数与从Java的UINT参数,但我不能转换INT为uint。因为它是一个窗口功能,我不能改变SendMessage函数的参数UINT。是否有这样做的一些方法?
背景: 实际上,我使用的处理,而我跟随以下教程访问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并不适用于我所提供的长。我不能修改的SendMessage任
下面的相应的Java文件上述调用呼叫时,GetActiveWindow部分工作正常,因为它从一个教程的。我试图调整SendMessage函数遵循它,但我还没有想通这一切了呢。不过,我不认为这关系到我得到的错误,因为改变参数来这里的SendMessage不改变编译器所期待的。我试图改变INT消息为uint消息到长消息,编译器仍然期望上面的代码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);
}
解决方案
如果您使用的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);
供您参考,这里的SendMessage函数在org.xvolks.jnative.util.User32实施。正如你所看到的,jnative代码不会在所有关于签署和未在意。你可能会发现它很有用抢 jnative源代码。
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本地接入看看( JNA)。
其他提示
从数据的角度来看,一个uint和int是相同的东西 - 一个32位的值。唯一的区别是操作码如何解释的最高位。当Java和C之间传递,你只是路过32位,因此符号是不相关的。该解决方案是只声明UINT参数作为int。
BTW,无符号/签署的问题不是显著这里,因为SendMessage函数的uMsg值为正的所有Microsoft邮件,对于这个问题,是其他任何你很可能会遇到很可能更加积极。
由于Java没有无符号类型的概念,你必须使用一个长来表示一个unsigned int。检查本网站关于如何做到这一点的例子。