我试图调用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。检查本网站关于如何做到这一点的例子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top