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?
我有一个使用extern "C"
公开API函数的C++DLL,我在Python中使用函数ctypes
包装函数使用这些函数。从本质上讲,我只想制作一个包装器来访问我的 DLL 的 API。
但是,我注意到,虽然我的大多数函数都可以正常工作,但有关已注册的回调进程和使用 Windows API 函数的仅消息窗口的功能RegisterClassEx
和CreateWindowEx
不起作用。
我使用的是 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);
}
}
}
编辑:
创建窗口后需要泵送消息。
相关文章:
- 导入库可以跨dll版本工作吗
- 名为DLL的C++windows服务程序工作不正常
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- PlayFunction在DLL中不起作用,但在独立的exe中工作
- Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?
- 如何将C++ dll 在 C# 窗口窗体应用程序下的工作线程中运行
- C++ Dll 无法在未安装 Visual Studio 的系统上工作
- DLL函数在VBA环境中不起作用,但在Excel VBA中工作
- 在dll中静态对象的破坏之前,要终止工作线程(但不是.exe)
- Dll进程挂钩不工作
- 运行在DLL中的工作线程在应用程序关闭时被终止,然后才能正常关闭它们
- 获取 dll include 以在 Visual Studio 中工作
- C++:无法使用 regsvr32 注册我的 DLL,但可以通过 IDE 工作
- C++Dll注入——Hello world Dll只有在注入到注入它的相同.exe中时才能工作
- 如何使 *.dll WinAmp 插件在朋友电脑上工作
- 为什么有些函数需要作为DLL文件注入才能工作
- 导入 DLL 的工作方式不同(VS2003 到 VS2010,多线程到多线程 DLL)
- 以下代码是如何工作的(从DLL加载动态类)
- C# IteropServices with C++ dll - 在excel中工作
- DLL 导致"Microsoft Excel has stopped working"但它在 Win32 控制台应用中工作正常