这些代码将把windows计算器设置为windows窗体应用程序。但问题是如何使用第三行中的NativeMethods.SetParent。它有特殊的命名空间吗?
System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc.exe");
p.WaitForInputIdle();
NativeMethods.SetParent(p.MainWindowHandle, this.Handle);
请帮助我使用第三行中的NativeMethods。
任何帮助都将不胜感激
3条答案
按热度按时间omtl5h9j1#
我假设您正在尝试将计算器“嵌入”到WinForm中?如果是这样,请查看以下pinvoke方法:
http://www.pinvoke.net/default.aspx/user32.setparent
要将计算器窗口嵌入到WinForm(或其他控件,如Panel)中,只需将
Control.Handle
作为第二个参数传递。arknldoa2#
NET中没有公共的
NativeMethods
类。将调用放在NativeMethods
类中被认为是一种很好的做法,因此这可能就是您所看到的。您需要使用P/Invoke来调用Win32 API函数。请参见this tutorial。
ycl3bljg3#
斯塔克斯评论说得很有道理:
一个明显的出发点是研究这行代码的原始源代码。您从哪里复制它的?您能在原始源代码中找到
NativeMethods.SetParent
的声明吗?(不需要回答,这意味着我会在这种情况下做什么的建议。)这正是你解决这类问题所需要的方法。
问题中显示的代码片段实际上是copied from here。不,当您将其复制并粘贴到您的项目中时,它不会编译。它从未打算编译。我并不试图编写一个完整的演示,而是提供了一个简短的草图,说明所需的代码 * 可能 * 看起来像是您自己编写的。
你必须阅读整个答案,而不仅仅是浅灰色背景的部分。我知道我们都是程序员,所以我们经常认为我们可以通过查看代码来理解一切,但这是一个不幸的谎言。您必须阅读文档,了解函数的作用,然后编写P/Invoke声明,以便可以从C#代码中调用它。
Like Kendall says时,对本机Win32函数的调用被放置在一个名为
NativeMethods
的静态类中,这既有约定,也有.NET设计指南(由StyleCop等工具强制执行)的明确建议。我的示例遵循了这一常见做法,因为我假设对Win32互操作感兴趣的.NET开发人员熟悉这一约定,并在编写P/Invoke定义时遵循它。As Nate alludes,有些人发现网站http://pinvoke.net/是为Win32函数编写P/Invoke定义时的一个有用的资源。它通常是这样的。但是你必须确保你不仅仅是从那里复制和粘贴代码,我在他们提供的样本中看到了惊人数量的错误(我回答了很多人提出的Stack Overflow问题,他们的应用程序在使用从该网站复制的错误代码时崩溃了)。你需要了解你使用的代码在做什么,以及它应该如何工作。这不仅可以确保您能够捕获它可能包含的任何错误,而且还可以防止您在应用程序中引入严重的bug或更糟的安全漏洞。