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;
'window.ToInt32() 'wird funktionieren. –
@Henk holterman Ich habe die Frage bearbeitet, aber kompiliert immer noch nicht –
Sie sollten Schlüsselabschnitte einer Frage nicht weg bearbeiten, fügen Sie einen nächsten Abschnitt hinzu. –