2009-05-09 8 views
2

Javaからuintパラメータを使用してSendMessageを呼び出そうとしていますが、intをuintに変換できません。 SendMessageのuintパラメータは、ウィンドウ関数なので変更できません。これを行うにはいくつかの方法がありますか?Javaで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); 

最後の行はエラーが発生した場所で、予想されるU32のタイプのUser32は、私が提供したLONGには適用されません。 SendMessageを変更することはできません

これは、上記の呼び出しで呼び出される対応するJavaファイルです。GetActiveWindowの部分は、チュートリアルのものですから、うまく動作します。私はそれに従うSendmessageを調整しようとしているが、私はまだそれをすべて考え出していない。しかし、ここでSendMessageへのパラメータを変更しても、コンパイラが期待しているものは変更されないため、私が得ているエラーは重要ではないと思います。私はint 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); 
} 

答えて

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)を見てみることができます。

+0

すごくありがとう! CompEでの私の学部教育は、Cプログラミングだけで成り立っていたので、このOOPのすべてが本当に私を混乱させます。しかし、それでも問題は私が 'UINT(WM_SYSCOMMAND);ではなく'(UINT)WM_SYSCOMMAND 'すべての違いをもたらした。私はまだ2つの違いを学んでいるが、もう一度ありがとう!もしできれば、私はあなたを2回投票します。しかし、私は11ポイントしか持っていないので、一度あなたに投票することさえできません。 – omikun

+0

この情報が役に立ちましたことをうれしく思います。これを回答としてマークすることもできますし、それは価値があります。 私はこれをOOPの問題と呼んでいます。 JavaとCの間に不一致があり、JNativeの作者はこの違いを処理する巧妙な方法を考え出しました。 – jdigital

-1

Javaには符号なし型の概念がないため、符号なし整数を表すにはlongを使用する必要があります。これを行う方法の例は、this siteを参照してください。

+0

ありがとうございます。しかし、SendMessageがuintを予期している場合、どうすればいいですか?私はまだそれを長いものに変更した後にそれをuintに変換することはできません。申し訳ありませんが、サイトがそれに答えた場合、私はどこでもそれを見つけることができません。再度、感謝します。 – omikun

+0

ああ、明確にするために、私はSendMessageを書いていません、それはuser32.dllの一部です。 SendMessageにuintの代わりに長い時間を受け入れるように強制する方法はありますか? – omikun

+0

あなたは最後に0xFFFFFFFFの長い、あなたと(&)itを渡さないので、最後に4バイトのuintになりますので、慎重にサイトをお読みください。 – ismail

3

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

ここでは、SendMessageのuMsg値がすべてのMicrosoftメッセージに対して肯定的であり、その点で他に遭遇する可能性が高いため、署名/署名の問題は重要ではありません。

+0

これまでのところそれは本当です。しかし、unsigned intを "設定"するには、以下のようなトリックを演奏しなければなりません:int foo =(int)4294967295L;またはint foo = 0xFF << 24 | 0xFF << 16 | 0xFF << 8 | 0xFF; (より便利なのはビットシーケンスの実際の意味に依存する)。あなたは単にすることはできません:int foo = 4294967295もちろん、Javaはfooが-1を参照することを意味すると考えます。リンク先のサイトカートマンは、それをより完全に説明します。 –

+0

問題はSendMessageが私が制御できる関数ではないことです。それはWindowsの一部であるuser32.dllにあります。 – omikun

関連する問題