2013-08-11 14 views
9

okno obsłużyć czasami typu int i innych porach typu IntPtrJak przekonwertować IntPtr int

int przykład:

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

IntPtr przykład:

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

nie wiem wydaje się być w stanie konwertować/rzutować z jednego na drugi.

Kiedy próbuję this.ProcessID = GetWindowThreadProcessId(windowHandle.ToInt32(),0) pojawia się błąd cannot implicitly convert from uint to int

+7

'windowhandle.ToInt32() 'zadziała. –

+0

@ Henk holterman Edytowałem pytanie, ale nadal nie kompilowałem –

+2

Nie powinieneś edytować kluczowych części pytania, dodaj następnej sekcji. –

Odpowiedz

10

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; 
1

Myślę, że błąd cannot implicitly convert from uint to int dotyczy = oświadczeniu. Pole this.ProcessID jest , ale GetWindowThreadProcessId zwraca.

Spróbuj

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