1

如果我用这个...

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

...要在我的 C# .Net4.5控制台应用程序中获取控制台实例并将其分配给一个变量(我在调用 user32 的MessageBox()方法时作为 hWnd 参数传递),当我需要调用 kernel32 的CloseHandle()方法时'完成了非托管变量?

当我尝试这个时,我得到一个 SEHException,我的谷歌搜索似乎表明它与调试模式和早期版本的 .NET 有关。

问题 1 - 我应该使用 CloseHandle,还是留下它让控制台资源自行解决?

问题 2 - SEHException 是完全不相关的,还是因为我试图在它仍然实例化时关闭控制台?


边注

为“菜鸟问题”道歉;我对非托管代码的经验几乎为零。

我知道有更好的方法可以做到这一点;我故意尝试在不导入 Windows.Forms 的情况下这样做

4

1 回答 1

3

您永远不应该在窗口句柄上调用CloseHandle 。关闭窗口的正确方法是调用DestroyWindow。应该调用 CloseHandle 来关闭内核对象的句柄,例如文件句柄、进程句柄等。窗口句柄是一个 GDI 对象,因此它不会被 CloseHandle 关闭。

但是 DestroyWindow 将关闭窗口,就像您单击关闭按钮一样。因此,要回答您的根本问题,您不需要在代码中关闭窗口句柄。除非您想关闭控制台窗口。

于 2014-08-19T17:04:08.387 回答