2013-08-11 2 views
9

окно обрабатывать иногда типа int и другие времена типа IntPtrКак преобразовать 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

+7

'WindowHandle.ToInt32() 'будет работать. –

+0

@Henk holterman Я редактировал вопрос, но до сих пор не компилируется –

+2

Нельзя редактировать ключевые части вопроса, добавить следующий раздел. –

ответ

10

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 бита IntPtr почти эквивалентно long (равные по размеру)

GetWindowThreadProcessId подпись

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

или

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

В этом случае, ref или out к " что-то "управляются ссылками на что-то, поэтому они перерабатываются внутри IntPtr при передаче в Native API. Таким образом, out uint, с точки зрения Native API, эквивалентен IntPtr.

Пояснение: важно то, что «длина» параметров является правильной. int и uint равны для названного API. И 32-разрядная IntPtr такая же.

Обратите внимание, что некоторые типы (например, bool и char) имеют специальную обработку маршаллером.

Вы не должны конвертировать int в IntPtr. Держите его как IntPtr и живите счастливым. Если вам нужно выполнить некоторые математические операции, которые не поддерживаются , используйте long (это 64 бит, поэтому до тех пор, пока у нас не будет Windows 128, проблем не будет :-)).

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

Я думаю, что ошибка cannot implicitly convert from uint to int относится к = заявления. Поле this.ProcessID является int, но GetWindowThreadProcessId возвращает uint.

Попробуйте

this.ProcessID = unchecked((int)GetWindowThreadProcessId(windowHandle.ToInt32(),0)) 
Смежные вопросы