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。

还是我有什么事?

Windows API 在 WPF 中不起作用

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();