在 C# 中使用 Windows API 调用有什么危险吗
Are there any dangers of using Windows API calls in C#
我想给文本框加水印,找到了几种不同的方法,但我喜欢的方法是使用 SendMessage 和外部 DLL。但是,我想我在某处听说这样做会导致 BSOD,因为它不受管理。这是真的吗,还是只是听说。
http://vidmar.net/weblog/archive/2008/11/05/watermarked-textbox-in-windows-forms-on-.net.aspx
private const uint ECM_FIRST = 0x1500;
private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
简短的回答是否定的。它不会导致蓝屏死机,尽管它可能会使您的程序崩溃。
WinForms 基本上构建在 Windows API 调用之上,因此如果操作正确,自定义 API 调用应该也能正常工作。
要记住的另一件事是,如果您调用 Windows API,它可能会产生可移植性问题,例如在移植到 Mono 时,因为这些 DLL 很可能不会可用。
我想给文本框加水印,找到了几种不同的方法,但我喜欢的方法是使用 SendMessage 和外部 DLL。但是,我想我在某处听说这样做会导致 BSOD,因为它不受管理。这是真的吗,还是只是听说。
http://vidmar.net/weblog/archive/2008/11/05/watermarked-textbox-in-windows-forms-on-.net.aspx
private const uint ECM_FIRST = 0x1500;
private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
简短的回答是否定的。它不会导致蓝屏死机,尽管它可能会使您的程序崩溃。
WinForms 基本上构建在 Windows API 调用之上,因此如果操作正确,自定义 API 调用应该也能正常工作。
要记住的另一件事是,如果您调用 Windows API,它可能会产生可移植性问题,例如在移植到 Mono 时,因为这些 DLL 很可能不会可用。