Windows API 在 WPF 中不起作用
本文关键字:不起作用 WPF API Windows | 更新日期: 2023-09-27 18:31:48
看起来
好像GetClassName
和其他一些Windows API在WPF中根本不起作用,而是使应用程序崩溃(无例外)。复制它非常简单。下面是完整的代码(在创建新的 WPF 应用程序后将其粘贴到 Window1
的代码隐藏中):
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Windows.Input;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(POINT p);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X, Y;
}
public MainWindow()
{
InitializeComponent();
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
var Pos = e.GetPosition(this);
var WindowUnderMouse = WindowFromPoint(new POINT() { X = (int)Pos.X, Y = (int)Pos.Y });
StringBuilder SB = new StringBuilder();
GetClassName(WindowUnderMouse, SB, 50);
MessageBox.Show(SB.ToString());
}
}
}
应用程序在GetClassName
呼叫中为我崩溃。我使用的是VS2015 + .NET 4.5。
还是我有什么事?
GetClassName
运行良好。但是,您不正确地调用它。当你写:
GetClassName(WindowUnderMouse, SB, 50);
您承诺提供长度为 50 的缓冲区。你不这样做。而不是:
StringBuilder SB = new StringBuilder();
用
StringBuilder SB = new StringBuilder(50);
现在,窗口类的最大名称为 256
。所以我会这样编写代码,包括错误检查:
StringBuilder SB = new StringBuilder(256);
if (GetClassName(WindowUnderMouse, SB, SB.Capacity) == 0)
throw new Win32Exception();