2012-06-01 31 views
-3

這些代碼將windows計算器設置爲一個windows窗體應用程序。但問題是如何在第三行中使用NativeMethods.SetParent。它有特殊的命名空間嗎?winform中的windows計算器

System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc.exe"); 
p.WaitForInputIdle(); 
NativeMethods.SetParent(p.MainWindowHandle, this.Handle); 

請幫我在第三行中使用NativeMethods。

任何幫助將不勝感激

+1

一個明顯的出發點是研究該代碼行的原始來源。你從哪裏複製它?你能在原始源中找到'NativeMethods.SetParent'的聲明嗎? (不需要回答,這意味着我會在這種情況下做出的建議。) – stakx

回答

2

我認爲你試圖在WinForm中「嵌入」計算器?如果是這樣檢查出以下的PInvoke方法:

[DllImport("user32.dll")] 
    internal static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

http://www.pinvoke.net/default.aspx/user32.setparent

要嵌入計算器窗口成一個WinForm(或另一控制諸如面板),只是通過Control.Handle作爲第二個參數。

+0

但它不會將其設置爲父母 – aliboy38

2

沒有公共NativeMethods類.NET。將電話撥入NativeMethods課程被認爲是良好的習慣,所以這可能是您所看到的。

您需要使用P/Invoke來調用Win32 API函數。請參閱this tutorial

0

stakx is onto something with his comment

一個明顯的出發點本來是研究該行代碼的原始來源。你從哪裏複製它?您能否在原始來源中找到NativeMethods.SetParent的聲明? (不需要回答,這意味着我會在這種情況下做出的建議)。

這正是您需要解決此類問題的方式。

問題中顯示的代碼片段實際上是copied from here。不,它在您複製並粘貼到項目中時不會編譯。它從來沒有打算 - 堆棧溢出不是一個代碼寫入服務。我並不是想寫一個完整的演示,而是提供一個簡短的草圖,說明你需要自己編寫的代碼可能是

你必須閱讀整個答案,而不是隻有淺灰色背景的部分。我知道我們都是程序員,所以我們經常認爲只要看代碼就能理解所有事情,但這是一個不幸的謊言。我提供a link to the Windows SDK documentation for the SetParent function;您必須閱讀該文檔,瞭解該函數的功能,然後編寫P/Invoke聲明,以便您可以從C#代碼中調用它。

Like Kendall says,調用本機Win32函數都放在一個叫做NativeMethods靜態類,都按照慣例,並通過從.NET設計指南明確推薦(通過工具,如強制執行了StyleCop)。我的例子是遵循這個常見的做法,因爲我認爲對Win32 interop感興趣的.NET開發人員會熟悉這個約定,並在編寫P/Invoke定義時自己遵循它。

As Nate alludes,在編寫Win32函數的P/Invoke定義時,有些人發現網站http://pinvoke.net/是一個有用的資源。它通常可以。但是你必須確保你不只是從那裏複製和粘貼代碼。我看到他們提供的樣本中出現了驚人的大量錯誤(並且當他們使用他們從該網站複製的不正確的代碼時,他們的應用程序崩潰的人員回答了我的公平份額堆棧溢出問題)。您需要了解您使用的代碼是,它的作用是以及它應該如何工作。這不僅確保您可以捕捉到它可能包含的任何錯誤,還可以防止您將嚴重的錯誤或更嚴重的安全漏洞引入到您的應用程序中。

+0

我沒有複製您的代碼。我只是想與該代碼一起工作。有什麼問題嗎?如果你有其他人使用你的代碼的問題,那麼爲什麼你要顯示代碼 – aliboy38

+0

是的,你複製了代碼。但這顯然不是問題。我不抱怨你複製它。問題在於你沒有閱讀解釋代碼的答案的其餘部分。這並不意味着是一個獨立的演示。堆棧溢出不是代碼寫入服務,它是一個問答網站。你應該尋找的是*答案*,而不是程序員 - 僱用。 –

+0

是不錯的科迪灰色 – user774411