0

如果我使用 System.Windows.Forms.MessageBox 类的 show 函数来绘制消息框,则会弹出一个窗口。我想知道绘制这个窗口的实际代码在哪里?它在一些 Win32 API 或 user32.dll 等中吗?通过反射器我无法看到 Show 方法的定义。

另外,.NET 是 win32 api 的包装器吗?我知道,当我们编译 .net 代码时,它会生成 IL,在运行时将其转换为 CPU 特定指令,然后我们的 CPU 会执行这些指令。但我感觉 Windows 操作系统中有一些通用代码负责绘制窗口(或从文本文件读取等)。所有这些语言,如 C++、F#、C#、Java 等,最终都会从框架内调用该代码。但问题是我如何才能找到它并验证它?

例如:在 MFC 或 Win32 中,无论我们调用哪个函数在屏幕上绘制窗口,MessageBox.Show 也调用相同的函数,但它是从我们抽象出来的?

另一方面,我们可以在两种语言之间进行交互。

所以我在这里有点困惑。这些天我也在通过 C# 阅读 CLR,所以我的大脑处于超级兴奋状态:-)

4

1 回答 1

4

我认为你走在正确的轨道上。无论是语言还是框架,最底层都是操作系统,所以一切都到此结束,最终:系统调用。

例如,要在 Windows 中打开文件CreateFile(),无论您使用的是 C fopen、C++ ifstream、C#System.IO.*还是 Java ,系统调用都是java.io.*

关于您对 System.Windows.Forms 的问题,它们使用通常的 Win32 窗口,因此这些窗口由HWND值标识,在 CLR 中表示为IntPtr.

关于显示窗口的功能,您的问题有点误导,因为涉及多个功能,并且 Win32 API 中有多个层。

例如要创建一个窗口,CreateWindowEx()如果隐藏调用,则调用 , 以显示它,并且当窗口过程(您必须编写的回调)接收到消息ShowWindow()时,将处理绘制本身。WM_PAINT但是为了接收消息,您必须编写一个消息泵 ( GetMessagte() / DispatchMessage())。

但是要创建一个简单MessageBox()的函数,已经有一个函数可以为您完成所有这些工作:MessageBox()System.Windows.Forms.MessageBox该类是一个直接包装器。

那么现在,问题是什么?啊,是的,我们可以System.Windows.Forms和Win32互操作吗?是的!

于 2012-12-05T00:12:54.423 回答