2013-08-11 14 views
9

Ein Fenster int und zu anderen Zeiten des Typs manchmal vom Typ int handle IntPtrWie IntPtr konvertieren

int Beispiel:

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

IntPtr Beispiel:

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

ich nicht scheinen in der Lage zu sein, von einem zum anderen zu konvertieren.

Wenn ich this.ProcessID = GetWindowThreadProcessId(windowHandle.ToInt32(),0) versuchen bekomme ich einen Fehler cannot implicitly convert from uint to int

+7

'window.ToInt32() 'wird funktionieren. –

+0

@Henk holterman Ich habe die Frage bearbeitet, aber kompiliert immer noch nicht –

+2

Sie sollten Schlüsselabschnitte einer Frage nicht weg bearbeiten, fügen Sie einen nächsten Abschnitt hinzu. –

Antwort

10

Die SendMessage Signatur ist

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

oder diese

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

nicht int und IntPtr tauschen Sie. Sie sind nahezu gleichwertig nur bei 32 Bits (gleich groß). Mit 64 Bits ist ein IntPtr fast äquivalent zu einem long (gleich groß)

Die GetWindowThreadProcessId Signatur ist

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

oder

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

In diesem Fall wird ein ref oder ein out auf " etwas "sind verwaltete Verweise auf etwas, so dass sie intern in IntPtr konvertiert werden, wenn sie an Native API übergeben werden. So ist out uint, aus Sicht der Native API, IntPtr.

Erläuterung: Wichtig ist, dass die "Länge" der Parameter korrekt ist. int und uint sind gleich für die aufgerufene API. Und ein 32bit IntPtr ist das gleiche auch.

Beachten Sie, dass einige Typen (wie bool und char) spezielle Handhabung durch den Marshaller haben.

Sie sollten niemals eine int in eine IntPtr konvertieren. Halten Sie es als IntPtr und leben Sie glücklich. Wenn Sie einige mathematische Operationen durchführen müssen, die nicht von IntPtr unterstützt werden, verwenden Sie long (es sind 64 Bit, also bis wir Windows 128 haben werden, wird es kein Problem geben :-)).

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

denke ich, dass Fehler cannot implicitly convert from uint to int-= Aussage bezieht. Das Feld this.ProcessID ist int, aber GetWindowThreadProcessId gibt uint zurück.

Versuchen Sie, diese

this.ProcessID = unchecked((int)GetWindowThreadProcessId(windowHandle.ToInt32(),0))