14

intタイプの場合もあればタイプの場合もあるウィンドウハンドルIntPtr

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)とすると、エラーが発生しますcannot implicitly convert from uint to int

4

3 に答える 3

14

SendMessageサインは

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

またはこれ

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

intと を交換しないでくださいIntPtr。これらは、32 ビット (サイズが等しい) でのみほぼ同等です。64 ビットでは、 anIntPtrは a とほぼ同等ですlong(サイズが等しい)。

GetWindowThreadProcessIdサインは

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

また

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

この場合、arefまたは a outto "something" は何かへのマネージド リファレンスであるため、IntPtrNative API に渡されるときに内部的に に変換されます。ネイティブout uintAPI の観点からは、IntPtr.

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

bool一部の型 (や などchar) は、マーシャラーによって特別に処理されることに注意してください。

を に変換しないでintくださいIntPtr。それをそのままにして、IntPtr幸せに生きてください。でサポートされていない数学演算を行う必要がある場合はIntPtr、 を使用しますlong(これは 64 ビットなので、Windows 128がリリースされるまでは問題ありません :-) )。

IntPtr p = ...
long l = (long)p;
p = (IntPtr)l;
于 2013-08-11T15:00:38.510 に答える