Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Windows API;CreateWindowEx";在Python(3.6.8)64位使用的DLL中工作? 我有一个使用Debug API函数的C++ DLL,使用了代码>外部“C”,我使用Python中的这些函数使用函数 cType < /Cord>包装器函数。本质上,我只想做一个包装器来访问DLL的API_Python_C++_Windows_Winapi_Ctypes - Fatal编程技术网

将Windows API;CreateWindowEx";在Python(3.6.8)64位使用的DLL中工作? 我有一个使用Debug API函数的C++ DLL,使用了代码>外部“C”,我使用Python中的这些函数使用函数 cType < /Cord>包装器函数。本质上,我只想做一个包装器来访问DLL的API

将Windows API;CreateWindowEx";在Python(3.6.8)64位使用的DLL中工作? 我有一个使用Debug API函数的C++ DLL,使用了代码>外部“C”,我使用Python中的这些函数使用函数 cType < /Cord>包装器函数。本质上,我只想做一个包装器来访问DLL的API,python,c++,windows,winapi,ctypes,Python,C++,Windows,Winapi,Ctypes,但是,我注意到,虽然我的大多数函数都能正常工作,但与注册回调进程和使用Windows API函数的仅消息窗口有关的功能RegisterClassEx和CreateWindowEx不起作用 我使用的是64位Python(3.6.8),所以我想知道是否存在不匹配。我的DLL是64位的,它可以在其他环境中工作。Windows API不起作用有什么原因吗 调试结果: 我的代码在回调过程中到达WM_CREATE事件,但没有到达WM_DEVICECHANGE事件。同样,这段代码在其他环境中也可以使用,因此我

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

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

调试结果:

我的代码在回调过程中到达
WM_CREATE
事件,但没有到达
WM_DEVICECHANGE
事件。同样,这段代码在其他环境中也可以使用,因此我试图找出Python的不同之处。

不接收广播消息:

“仅限消息”窗口允许您发送和接收消息。它是 不可见、没有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);
        }
    }
}
#包括
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_创建:
MessageBox(空,“WM_创建”,“消息”,0);
打破
案例WM_设备变更:
MessageBox(空,“WM_DEVICECHANGE”,“Message”,0);
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
返回0;
}
int main()
{
静态常量字符*class\u name=“name\u class”;
WNDCLASSEX wx={};
HWND-HWND;
HINSTANCE HINSTANCE=GetModuleHandleA(NULL);
wx.cbSize=sizeof(WNDCLASSEX);
wx.lpfnWndProc=WndProc;//处理消息的函数
wx.hInstance=hInstance;
wx.lpszClassName=类名称;
如果(寄存器类(&wx)){
hwnd=CreateWindowEx(0,类名,“标题”,0,0,0,0,0,hwnd\u消息,NULL,NULL,NULL);
//hwnd=CreateWindowEx(0,类名,“标题”,WS_重叠窗口,CW_USEDEFAULT,0,CW_USEDEFAULT,0,nullptr,nullptr,hInstance,nullptr);
//创建一个可以接收广播消息的普通顶级窗口。
}
HACCEL hAccelTable=装载加速器(hInstance,类别名称);
味精;
while(GetMessage(&msg,nullptr,0,0))
{
if(!TranslateAccelerator(msg.hwnd、hAccelTable和msg))
{
翻译信息(&msg);
发送消息(&msg);
}
}
}
编辑:


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

创建窗口只需战斗的十分之一。另外90%正在运行消息泵(参见
GetMessage
等)。向窗口过程传递
WM_DEVICECHANGE
和其他消息的内容。您可能需要为此旋转一个线程。
WM_CREATE
在退出之前由
CreateWindowEx()
本身发送,因此它不依赖于活动的消息循环,与大多数其他消息不同,你在你的应用程序中登记这些消息吗?@ ReMyLeBeAube我在C++中创建了包装器函数,并且可以调用C++环境中的函数(比如QT),其中总是可以找到WME DeVice变化。我正在尝试思考Python被阻止的原因。我检查了RegisterDeviceNotification,它返回true,所以我不明白为什么没有通知进来。我的DLL是64位的,Python是64位的。我还在32位版本的Python中尝试了一个32位DLL,但也不起作用。其他功能也可以工作,所以事件系统不接收通知。它在以C和C++为基础的其他环境中工作。我收到的事件通知没有任何问题,因此我认为您的答案不适用。这是我在Python中尝试时唯一遇到的问题。导入其他模块会破坏为DLL创建包装的目的。不,不会。虽然我不知道你的环境是如何工作的(因为我还没有看到代码),但是我可以共享一个我测试过的C++样本,它不能得到“消息”> WME DeVice Tys//Code >带有消息的窗口。@DavidHeffernan您的意思是只有消息的windows才能获取
WM_DEVICECHANGE
或在python或DLL中广播消息?您可以注册以接收这些消息。不要妄下结论说询问者希望收到广播。另外,请阅读问题,即有关已注册回调进程的功能。