在静态方法中使用user32.dll的正确语法是什么

本文关键字:语法 是什么 dll user32 静态方法 | 更新日期: 2023-09-27 18:20:37

在下面的代码中,为什么user32会导致错误?

我认为,通过在方法体上添加[DllImport("user32.dll", CharSet = CharSet.Unicode)],我可以生成类似user32.IsWindowVisible(hWnd)的语句,但这行代码的user32部分导致了错误。

这是一个完整的例子。如果你将其复制粘贴到visualstudio中的类文件中,你会看到错误:

using System.Collections.Generic;
using System.Runtime.InteropServices;
using System;
using System.Text;
namespace Pinvoke.Automation.Debug.Examples
{
   internal static class ExampleEnumDesktopWindows
    {
        public delegate bool EnumDelegate(IntPtr hWnd, int lParam);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool IsWindowVisible(IntPtr hWnd);

        [DllImport("user32.dll", EntryPoint = "GetWindowText",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

        [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows",
        ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);
       [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
        static void DoExample()
        {
            var collection = new List<string>();
            user32.EnumDelegate filter = delegate(IntPtr hWnd, int lParam)
            {
                StringBuilder strbTitle = new StringBuilder(255);
                int nLength = user32.GetWindowText(hWnd, strbTitle, strbTitle.Capacity + 1);
                string strTitle = strbTitle.ToString();
                if (user32.IsWindowVisible(hWnd) && string.IsNullOrEmpty(strTitle) == false)
                {
                    collection.Add(strTitle);
                }
                return true;
            };
            if (user32.EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero))
            {
                foreach (var item in collection)
                {
                    Console.WriteLine(item);
                }
            }
            Console.Read();
        }
    }
}

在静态方法中使用user32.dll的正确语法是什么

p/invoke需要DLL名称和EntryPoint属性,这两个属性都在DllImport属性中指定。

您的代码不关心这些。它只使用您在声明DllImport注释方法时使用的标识符。

在您的情况下,标识符是IsWindowVisible,完全限定名称是Pinvoke.Automation.Debug.Examples.ExampleEnumDesktopWindows.IsWindowVisible

必须在标记为"static"answers"extern"的方法上指定DllImport属性,因此不能在DoExample()方法上指定它。

尝试从该方法中删除它,然后删除user32。来自DoExample()函数内部的方法调用。