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

2024-09-29 23:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C++函数的DLL,使用^ {< CD1>},我在Python中使用这些函数使用函数^ {CD2>}包装函数。本质上,我只想做一个包装器来访问我的DLL的API。在

但是,我注意到,虽然我的大多数函数都能正常工作,但是关于注册的回调进程和使用windowsapi函数RegisterClassExCreateWindowEx的消息窗口的功能不起作用。在

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

调试结果:

我的代码在回调过程中到达WM_CREATE事件,但没有到达WM_DEVICECHANGE事件。同样,这段代码是在其他环境中实现的,所以我试图找出使用Python有什么不同。在


Tags: 函数代码功能api消息进程事件dll
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:38

Message-Only Windows接收广播消息:

A message-only window enables you to send and receive messages. It is not visible, has no z-order, cannot be enumerated, and does not receive broadcast messages. The window simply dispatches messages.

{cd1>而不是调用top}窗口。在

另外,您不需要通过DLL调用CreateWindow/CreateWindowEx,尝试通过导入模块win32api、win32con、win32gui来使用WinAPI。这是一个sample。在

更新:

C++样本,不能用消息窗口接收^ {< CD4>}。在

#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);
        }
    }
}

编辑:

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

相关问题 更多 >

    热门问题