質問

私はJavaからUINTパラメータでのSendMessageを呼び出すしようとしているが、私はuintにint型に変換することはできません。それは、Windowsの機能であるので、私はの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は、上記第2のリンクからだ、正常に動作します。

 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にパラメータを変更すると、コンパイラが期待するものは変更されませんので、私は、取得していますエラーに重要とは思いません。私は長いメッセージにメッセージをuintにint型メッセージを変更しようとした、コンパイラはまだ上記のコードから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);

は、あなたの参考のために、ここでorg.xvolks.jnative.util.User32でのSendMessageの実装です。あなたが見ることができるように符号付きと符号なしについて、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)のます。

他のヒント

32ビット値 -

データの観点から、UINT及びINTは同じものです。唯一の違いは、オペコードは、最上位ビットをどのように解釈するかです。 JavaとCの間を通過するときに、あなただけの32ビットを渡しているので、符号は関係ありません。解決策は、単にintとしてUINTパラメータを宣言することです。

ところで、署名符号なしの問題は、/のSendMessageためuMsg値は、すべてのMicrosoftのメッセージが陽性であり、そのことについては、あなたが遭遇する可能性が高いです、何のための可能性よりも正であるため、ここでは重要ではありません。

Javaは符号なしの型の概念を持っていないので、

、あなたはunsigned int型を表現するために長いを使用する必要があります。これを行う方法の例については、このサイトを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top