2013-08-11 66 views
9

Một cửa sổ xử lý đôi khi kiểu int và thời điểm khác trong kiểu IntPtrLàm thế nào để chuyển đổi IntPtr để int

int dụ:

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

IntPtr dụ:

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

tôi không dường như có khả năng chuyển đổi/truyền từ một đến khác.

Khi tôi cố gắng this.ProcessID = GetWindowThreadProcessId(windowHandle.ToInt32(),0) tôi nhận được một lỗi cannot implicitly convert from uint to int

+7

'windowHandle.ToInt32() 'sẽ hoạt động. –

+0

@Henk holterman Tôi đã chỉnh sửa câu hỏi, nhưng vẫn không biên dịch –

+2

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. –

Trả lời

10

Chữ ký SendMessage

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 intIntPtr. 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

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. intuint 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ư boolchar) 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; 
1

Tôi nghĩ rằng lỗi cannot implicitly convert from uint to int đề cập đến câu hỏi =. Trường this.ProcessIDint, nhưng GetWindowThreadProcessId trả lại uint.

Hãy thử điều này

this.ProcessID = unchecked((int)GetWindowThreadProcessId(windowHandle.ToInt32(),0)) 
Các vấn đề liên quan