Chữ ký SendMessage
là
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
hay này
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
Đừng trao đổi int
và IntPtr
. Chúng gần như tương đương chỉ ở 32 bit (bằng kích thước). Tại 64 bit một IntPtr
là gần tương đương với một long
(bình đẳng về kích thước)
Chữ ký GetWindowThreadProcessId
là
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
hoặc
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
Trong trường hợp này, một ref
hoặc một out
tới " một cái gì đó "được quản lý tài liệu tham khảo cho một cái gì đó, vì vậy họ được chuyển đổi nội bộ để IntPtr
khi được chuyển đến Native API. Vì vậy, out uint
là, từ quan điểm của API gốc, tương đương với IntPtr
.
Giải thích: Điều quan trọng là độ dài "" của thông số là chính xác. int
và uint
bằng nhau cho API được gọi. Và một sốcũng giống nhau.
Lưu ý rằng một số loại (như bool
và char
) có xử lý đặc biệt của trình so khớp.
Bạn không nên EVER chuyển đổi int
thành IntPtr
. Giữ nó như là một IntPtr
và sống hạnh phúc. Nếu bạn phải thực hiện một số thao tác toán học không được hỗ trợ bởi IntPtr
, hãy sử dụng long
(64 bit, vì vậy cho đến khi chúng tôi có Windows 128, sẽ không có bất kỳ sự cố nào :-)).
IntPtr p = ...
long l = (long)p;
p = (IntPtr)l;
'windowHandle.ToInt32() 'sẽ hoạt động. –
@Henk holterman Tôi đã chỉnh sửa câu hỏi, nhưng vẫn không biên dịch –
Bạn không nên chỉnh sửa các phần chính của câu hỏi, thêm phần tiếp theo. –