2013-04-29 41 views
1

我很困惑各種聲明SendMessage。我怎麼知道哪一個是正確的?在我的C#winforms應用程序(Windows 7)中,我使用以下內容;什麼是SendMessage的正確聲明,以及如何將我的代碼轉換爲使用其參數?

public class NativeMethods 
{ 
    [DllImport("user32.dll")] 
    // Currently uses 
    public static extern int SendMessage(IntPtr hWnd, uint wMsg, int wParam, int lParam); 
    // Think I should probably be using 
    // public static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam); 
} 

但調用SendMessage函數的代碼是

NativeMethods.SendMessage(this.tv.Handle, 277, 1, 0); 

如何找出參數來使用,這樣我可以切換到其他的申報?

回答

7

看看頭文件或MSDN文檔,然後你需要一些推斷。

在你的情況,實際的C原型是:

LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); 

及相關類型定義是:

typedef unsigned int UINT; 
typedef LONG_PTR LPARAM; 
typedef UINT_PTR WPARAM; 
typedef LONG_PTR LRESULT; 

所以正確的C#的聲明是:

[DllImport("user32.dll")] 
public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, 
           UIntPtr wParam, IntPtr lParam); 

IntPtrUIntPtr的構造函數採用純整數,所以th ERE不是問題直接調用它:

NativeMethods.SendMessage(this.tv.Handle, 277, new UIntPtr(1), IntPtr.Zero); 

其實,一切都如你尊重每個參數的大小可以作爲長,但你如果你希望你的代碼是32間移植要小心64位。

0

Kirsten,這是一個互操作問題。大多數C++示例爲SendMessage的參數指定int或uint;順便C#將其解釋值不會真的沒關係,只要

  • 傳遞正確
  • 大小是正確的位模式
  • 編組是適當

實際上有很多事情要處理,對於堆棧溢出回答來說太多了。你需要谷歌的話是「interop」和「marshalling」。

您還應該注意,除非發件人具有提升的權限,否則發送消息可能會發生跨進程問題。而SendMessage是同步的。你確定你不想PostMessage?

相關問題