Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?

Will Windows API "CreateWindowEx" work in a DLL used by Python (3.6.8) 64-bit?

本文关键字:DLL 工作 CreateWindowEx API Python Windows      更新时间:2023-10-16

我有一个使用extern "C"公开API函数的C++DLL,我在Python中使用函数ctypes包装函数使用这些函数。从本质上讲,我只想制作一个包装器来访问我的 DLL 的 API。

但是,我注意到,虽然我的大多数函数都可以正常工作,但有关已注册的回调进程和使用 Windows API 函数的仅消息窗口的功能RegisterClassExCreateWindowEx不起作用。

我使用的是 Python (3.6.8( 64 位,所以我想知道是否存在不匹配。我的 DLL 是 64 位的,它可以在其他环境中工作。有什么原因只是Windows API不起作用吗?

调试结果:

我的代码到达回调进程中的 WM_CREATE 事件,但没有到达WM_DEVICECHANGE事件。同样,这段代码在其他环境中也可以到达,所以我试图弄清楚使用 Python 有什么不同。

仅消息 Windows 接收广播消息:

仅消息窗口使您能够发送和接收消息。是的 不可见,没有 z 顺序,无法枚举,并且不 接收广播消息。该窗口只是调度消息。

相反,您应该创建一个顶级窗口,并且不要调用showWindow

另外,你不需要通过DLL调用CreateWindow/CreateWindowEx,尝试通过导入模块win32api、win32con、win32gui来使用WinAPI。下面是一个示例。

更新:

C++无法接收WM_DEVICECHANGE的"仅消息"窗口的示例。

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        MessageBox(NULL, "WM_CREATE", "Message", 0);
        break;
    case WM_DEVICECHANGE:
        MessageBox(NULL, "WM_DEVICECHANGE", "Message", 0);
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
int main()
{
    static const char* class_name = "NAME_CLASS";
    WNDCLASSEX wx = {};
    HWND hwnd;
    HINSTANCE hInstance = GetModuleHandleA(NULL);
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.lpfnWndProc = WndProc;        // function which will handle messages
    wx.hInstance = hInstance;
    wx.lpszClassName = class_name;
    if (RegisterClassEx(&wx)) {
        hwnd = CreateWindowEx(0, class_name, "Title", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
    //  hwnd = CreateWindowEx(0, class_name, "Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    //  Create a normal top-level window which can receive the broadcast messages. 
    }
    HACCEL hAccelTable = LoadAccelerators(hInstance, class_name);
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}

编辑:

创建窗口后需要泵送消息。