为什么尽管所有必需的功能都存在,但窗口始终不显示
Why does the window never show up, although all required functions are present?
我一直在尝试制作一个通用DLL,以便将其注入进程&一扇窗户就会弹出。我拥有所有必需的函数,如WinMain(我将我的命名为Initiate并手动调用它)、DllWindowProcedure和DllMain。然而,经过编译,有一个警告,没有错误——我相信这是一个逻辑错误。如果你发现任何问题,或者我可以改进的地方,请告诉我!
警告:
1> Main.cpp(43):警告C4060:switch语句不包含"case"或"default"标签
代码:
#include <Windows.h>
HINSTANCE InjectedModuleHandle;
LRESULT CALLBACK DllWindowProcedure(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI DllThreadProcedure(void * Data)
{
MessageBoxA(NULL, (LPCSTR)"Welcome to Flames v1.1!", (LPCSTR)"Startup Message", NULL);
MSG Messages;
WNDCLASSEX WindowClass;
WindowClass.hInstance = InjectedModuleHandle;
WindowClass.lpszClassName = L"DllWindowClass";
WindowClass.lpfnWndProc = DllWindowProcedure;
WindowClass.style = CS_DBLCLKS;
WindowClass.cbSize = sizeof(WNDCLASSEX);
WindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WindowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WindowClass.lpszMenuName = NULL;
WindowClass.cbClsExtra = 0;
WindowClass.cbWndExtra = 0;
WindowClass.hbrBackground = (HBRUSH)RGB(255, 255, 255);
RegisterClassEx(&WindowClass);
HWND Window = CreateWindowEx(0, L"DllWindowClass", L"Flames v1.1 - By XenoSaga3000", (WS_SYSMENU | WS_MINIMIZEBOX), 200, 200, 500, 450, FindWindow(NULL, L"ROBLOX"), CreateMenu(), InjectedModuleHandle, NULL);
ShowWindow(Window, SW_SHOWNORMAL);
while (GetMessage(&Messages, NULL, 0, 0))
{
TranslateMessage(&Messages);
DispatchMessage(&Messages);
};
return 1;
};
LRESULT CALLBACK DllWindowProcedure(HWND Window, UINT Message, WPARAM WParameter, LPARAM LParameter)
{
switch (Message)
{
case WM_COMMAND:
switch(WParameter)
{
//Check for commands here.
};
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(Window, Message, WParameter, LParameter);
};
return 0;
};
bool APIENTRY DllMain(HMODULE DllInstance, DWORD Reason, LPVOID Reserved)
{
if(Reason == DLL_PROCESS_ATTACH)
{
InjectedModuleHandle = DllInstance;
CreateThread(0, NULL, DllThreadProcedure, NULL, NULL, NULL);
};
return TRUE;
};
您可以在这个博客中查看您的案例示例。
区别之一是它使用DllMain提供的HINSTANCE
作为窗口类的实例句柄。GetModuleHandle(NULL)
返回调用进程的实例句柄,而不是DLL。
请注意,不建议使用Windows API调用,如从DllMain调用CreateThread,请参阅此处。
相关文章:
- C++模板来检查友元函数的存在
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- 问:如何使用C++中的按钮从窗口打开窗口
- C++:对不存在的命名空间使用命名空间指令
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- C++quit()函数中可能存在作用域问题
- QuadTree只在窗口的右上角绘制
- C++擦除(如果存在)
- 为什么 MDI 子窗口在WM_NCCREATE后不存在?
- 通过 pid 窗口判断进程是否存在
- 使用 OpenGL 窗口(如 GLFW)或周围的窗口(如 GTK 或 SDL)是否存在性能差异?
- 如果窗口存在,如何签入 xlib?
- 为什么尽管所有必需的功能都存在,但窗口始终不显示
- 如果带有HWND的窗口仍然存在,我该如何确定
- VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?
- 正在向不存在的窗口发送消息