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;
'WindowHandle.ToInt32() 'будет работать. –
@Henk holterman Я редактировал вопрос, но до сих пор не компилируется –
Нельзя редактировать ключевые части вопроса, добавить следующий раздел. –