2013-08-11 14 views
9

をintにのIntPtrを変換する方法IntPtrウィンドウが時々タイプ<code>int</code>とタイプの他の回の柄

int例:

[DllImport("user32.dll")] 
    static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);  

IntPtr例:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam); 

私にはありませんあるものから別のものへ変換/キャストすることができるようです。私はthis.ProcessID = GetWindowThreadProcessId(windowHandle.ToInt32(),0)をしようとすると

私はSendMessage署名がintIntPtrを交換しないでください

static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

またはこの

static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam); 

でエラーにcannot implicitly convert from uint to int

+7

'windowHandleを試してみてください。ToInt32() 'が動作します。 –

+0

@Henk holterman質問を編集しましたが、まだコンパイルしません –

+2

質問の主要部分を編集して次のセクションを追加しないでください。 –

答えて

10

を取得します。それらは32ビット(サイズが等しい)でのみほぼ同等です。 64ビットIntPtrlong(サイズが等しい)

とほぼ同等であるにGetWindowThreadProcessId署名は、「へref又はoutこの場合

static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

又は

static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 

あります何か "は何かへの参照が管理されているため、Native APIに渡されると内部的にIntPtrに変換されます。したがってout uintは、ネイティブAPIの観点からは、IntPtrに相当します。

説明重要なことは、パラメータの「長さ」が正しいことです。 intuintは、呼び出されたAPIと同等です。そして、32ビットIntPtrも同じです。

一部の種類(boolおよびcharなど)には、マーシャラによる特別な処理があります。

intIntPtrに変換してはなりません。 IntPtrとし、幸せな生活を送ってください。 IntPtrでサポートされていない演算をいくつか行う必要がある場合は、longを使用してください(64ビットなので、のWindows 128になるまで問題はありません:-))。

IntPtr p = ... 
long l = (long)p; 
p = (IntPtr)l; 
1

私はエラーcannot implicitly convert from uint to int=の文を参照していることと思います。フィールドthis.ProcessIDintですが、GetWindowThreadProcessIduintを返します。

この

this.ProcessID = unchecked((int)GetWindowThreadProcessId(windowHandle.ToInt32(),0)) 
関連する問題