Podpis SendMessage
jest
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
czy to
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
Nie wymieniać int
i IntPtr
. Są prawie równoważne tylko 32 bitom (równej wielkości). Po 64 bitów IntPtr
jest prawie równoważne long
(równej wielkości)
Podpis GetWindowThreadProcessId
jest
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
lub
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
W tym przypadku, ref
lub out
do " coś "są odniesieniami zarządzanymi do czegoś, więc po przejściu na Native API są wewnętrznie przekonwertowane na IntPtr
. Tak więc, z punktu widzenia Natywnego API, jest to równoważne z IntPtr
.
Objaśnienie: Ważne jest, aby "długość" parametrów była prawidłowa. int
i uint
są równe nazwanym API. A 32-bitowy IntPtr
jest taki sam.
Należy zwrócić uwagę, że niektóre typy (takie jak bool
i char
) są traktowane przez Marshalla jako specjalne.
Nie należy EVER konwertować int
na IntPtr
. Zachowaj to jako IntPtr
i żyj szczęśliwe. Jeśli musisz wykonać pewne operacje matematyczne nieobsługiwane przez IntPtr
, użyj long
(to 64 bity, więc dopóki nie będziemy mieć Windows 128, nie będzie żadnego problemu :-)).
IntPtr p = ...
long l = (long)p;
p = (IntPtr)l;
'windowhandle.ToInt32() 'zadziała. –
@ Henk holterman Edytowałem pytanie, ale nadal nie kompilowałem –
Nie powinieneś edytować kluczowych części pytania, dodaj następnej sekcji. –