我正在使用.Net 6和PInvoke nuget包来访问Win32 API,我将按以下方式创建Win32窗口:

  IntPtr windowHandle = User32.CreateWindowEx(User32.WindowStylesEx.WS_EX_TOOLWINDOW,
                               "static",
                               "Window Title",
                               User32.WindowStyles.WS_OVERLAPPEDWINDOW |
                               User32.WindowStyles.WS_VISIBLE,
                               0,
                               0,
                               800,
                               800,
                               IntPtr.Zero,
                               IntPtr.Zero,
                               IntPtr.Zero,
                               IntPtr.Zero);

当窗口在屏幕上显示时,我有the same situation as this guy个窗口渲染良好,但对用户没有响应.当我将鼠标移到窗口上时,鼠标指针变为加载圆.

我认为没有响应是由于没有处理窗口事件和消息.我想以某种方式重写或钩住Win32窗口的WndProc方法来处理消息,显然是the User32.GetMessage() does not return all messages.

在WPF中,您可以add a hook to the HwndHost来处理WndProc消息.如何获取WndProc消息.Net 6而不使用WPF?

推荐答案

这是Program.cs文件的完整内容,在我了解了如何对User32进行子类化之后.WNDCLASS.项目使用.新console template that uses implicit using statements and no explicit class definition or Main method.的净6

代码如下:

using PInvoke;

unsafe
{
    User32.WndProc myWndProc = CustomWndProc;
    string className = "MyClassName";
    fixed (char* namePointer = className)
    {
        var window = new User32.WNDCLASS();
        window.lpszClassName = namePointer;
        window.lpfnWndProc = myWndProc;
        var ret = User32.RegisterClass(ref window);
        if (ret != 0)
        {
            // do some error handling here...
        }

        var windowHandle = User32.CreateWindowEx(
                                            User32.WindowStylesEx.WS_EX_APPWINDOW,
                                            className,
                                            "Window Title",
                                            User32.WindowStyles.WS_OVERLAPPEDWINDOW |
                                            User32.WindowStyles.WS_VISIBLE,
                                            100,
                                            100,
                                            800,
                                            800,
                                            IntPtr.Zero,
                                            IntPtr.Zero,
                                            IntPtr.Zero,
                                            IntPtr.Zero);
        User32.MSG msg;
        while (User32.GetMessage(&msg, windowHandle, User32.WindowMessage.WM_NULL, User32.WindowMessage.WM_NULL) > 0)   // synchonous call, will block the thread till a message is received
        {
            User32.TranslateMessage(&msg);
            User32.DispatchMessage(&msg);
        }
    }

    static IntPtr CustomWndProc(IntPtr hWnd, User32.WindowMessage msg, void* wParam, void* lParam)
    {
        return User32.DefWindowProc(hWnd, msg, (IntPtr)wParam, (IntPtr)lParam);
    }
}

delegate User32.WndProc WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

Edit:我使用PInvoke nuget包添加了WndProc消息的处理.

Csharp相关问答推荐

元素存在方法是否损坏

发布.NET框架项目将.NET核心元素注入到web. connect中

无法将blob发送到Azure -缺少HTTP标头异常

错误NU 1301:无法加载源的服务索引

ListaryImportProperty的默认DllImportSearchPathsProperty行为

Serilog SQL服务器接收器使用UTC作为时间戳

EF Core在请求列表时忽略列,但在按ID获取时包含

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

使用Entity Framework6在对象中填充列表会导致列表大多为空

JsonSchema.Net删除假阳性判断结果

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

将操作从编辑页重定向到带参数的索引页

Blazor Server.NET 8中的Blazore.FluentValidation问题

Azure函数-在外部启动类中生成配置时出错

如何从非异步任务中正确返回TypeResult

使用未赋值的、传递的局部变量

ASP.NET Core 8 Web API:如何添加版本控制?