-3

これらのコードは、Windows 電卓を Windows フォーム アプリケーションに設定します。しかし問題は、3 行目の NativeMethods.SetParent をどのように使用するかです。特別な名前空間はありますか?

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

3行目でNativeMethodsを使用するのを手伝ってください。

どんな助けでも大歓迎です

4

3 に答える 3

2

.NET には publicNativeMethodsクラスはありません。呼び出しをNativeMethodsクラスに入れることは良い習慣と考えられているので、これはおそらくあなたが見ているものです。

Win32 API 関数を呼び出すには、P/Invoke を使用する必要があります。このチュートリアルを参照してください。

于 2012-06-01T21:46:06.173 に答える
2

WinForm 内に電卓を「埋め込もう」としていると思いますか? その場合は、次の pinvoke メソッドを確認してください。

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

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

電卓ウィンドウを WinForm (または Panel などの別のコントロール) に埋め込むにはControl.Handle、2 番目のパラメーターとして を渡すだけです。

于 2012-06-01T21:46:51.337 に答える
0

stakx は彼のコメントで何かに取り組んでいます:

明らかな出発点は、そのコード行の元のソースを調査することでした。どこからコピペしたの?NativeMethods.SetParent元のソースでの宣言を見つけることができますか? (答える必要はありません。これは、この場合に私が何をしたかを示唆するものです。)

これは、まさにそのような問題を解決するために必要な方法です。

質問に示されているコード スニペットは、実際には here からコピーされました。いいえ、コピーしてプロジェクトに貼り付けてもコンパイルされません。Stack Overflow はコード作成サービスではありません。完全なデモを書き込もうとしているわけではありませんが、必要なコードを自分で書いた場合にどのようになるかを簡単示します。

明るい灰色の背景の部分だけでなく、回答全体を読む必要があります。私たちは皆プログラマーなので、コードを見ただけですべてを理解できると考えがちですが、それは残念な嘘です。関数の Windows SDK ドキュメントへのリンクSetParentを提供しました。そのドキュメントを読み、関数の機能を理解してから、C# コードから呼び出せるように P/Invoke 宣言を記述する必要があります。

Kendall が言うように、ネイティブ Win32 関数の呼び出しは、NativeMethods慣例と .NET 設計ガイドラインからの明示的な推奨 (StyleCop などのツールによって強制される) の両方によって、 という静的クラスに配置されます。Win32 相互運用に関心のある .NET 開発者はこの規則に精通しており、P/Invoke 定義を作成するときにそれに従うと想定していたため、私のサンプルはこの一般的な方法に従っていました。

Nate がほのめかしているように、Win32 関数の P/Invoke 定義を記述する際に、Web サイトhttp://pinvoke.net/が役立つリソースであると考える人もいます。そして、そうなることがよくあります。ただし、そこからコードをコピーして貼り付けるだけではないことも確認する必要があります。私は彼らが提供するサンプルに驚くほど多くの間違いを見てきました (そして、そのウェブサイトからコピーした間違ったコードを使用したときにアプリが爆発した人々からのスタック オーバーフローの質問のかなりの割合以上に答えました)。使用しているコードが何をしているのか、どのように動作するのかを理解する必要があります。これにより、含まれている可能性のある間違いを確実に見つけることができるだけでなく、アプリケーションに深刻なバグやさらに悪いことにセキュリティ ホールを持ち込むことを防ぐこともできます。

于 2012-06-03T10:23:33.690 に答える