J'essaie de tester une condition booléenne mais pour une raison quelconque, cela ne me permet même pas d'appeler la fonction dans ma classe de fenêtre. J'ai essayé de créer un objet et d'hériter des fonctions et d'obtenir toujours le même message. il me laissera faire if(Attach::attachProc)
Cela renvoie toujours true alors qu'il est censé renvoyer false dans la démo. mais non if(AttachProc())
. la source de la classe de fenêtre Windows.cpp
#include "Window.h"
#include "Attach.h"
Window* window = nullptr;
Attach attach;
Window::Window()
{
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_CREATE:
{
//Event fired when the windows will be created
break;
}
case WM_COMMAND:
switch (LOWORD(wparam))
{
case ID_INJECT:
if (Attach::attachProc())
{
MessageBox(0, "injected", "", MB_ICONERROR | MB_OK);
}
else
{
MessageBox(0, "faile to inject", "", MB_ICONERROR | MB_OK);
}
default:
break;
}
case WM_DESTROY:
{
window->onDestroy();
//Event fired when the window will be destroyed
::PostQuitMessage(0);
break;
}
default:
return ::DefWindowProc(hwnd, msg, wparam, lparam);
}
return NULL;
}
bool Window::init()
{
WNDCLASSEX wc;
wc.cbClsExtra = NULL;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra = NULL;
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = NULL;
wc.lpszClassName = "MyWindowClass";
wc.lpszMenuName = "";
wc.style = NULL;
wc.lpfnWndProc = WndProc;
if (!::RegisterClassEx(&wc))
return false;
if (!window)
window = this;
m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "MyWindowClass", "T3chSpl10ts", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT
, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL);
//if creation fails return false
if (!m_hwnd)
return false;
b_hwnd = CreateWindow("Button", "Inject",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 20, 20, 100, 30,
m_hwnd, (HMENU)ID_INJECT, GetModuleHandle(NULL), NULL);
//show up the window
::ShowWindow(m_hwnd, SW_SHOW);
::UpdateWindow(m_hwnd);
//set this flag to indicate that the window is initialized and running
m_is_run = true;
return true;
}
bool Window::broadcast()
{
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Sleep(0);
return true;
}
bool Window::release()
{
//Destroy the window
if (!::DestroyWindow(m_hwnd))
return false;
return true;
}
bool Window::isRun()
{
return m_is_run;
}
void Window::onDestroy()
{
m_is_run = false;
}
Window::~Window()
{
}
Fenêtre.h
#pragma once
#include <Windows.h>
#include "Attach.h"
#define Button 0
#define ID_INJECT 1
class Window : public Attach
{
public:
Window();
~Window();
bool init();//Initializes the window
bool broadcast();
bool isRun();
bool release();
virtual void onDestroy();
//virtual void onCreate();
//virtual void onUpdate();
protected:
HWND m_hwnd;
HWND b_hwnd;
bool m_is_run;
};
attacher.h
#pragma once
#include<Windows.h>
#include<TlHelp32.h>
#include<cstdlib>
#include<iostream>
class Attach
{
public:
bool attachProc();
protected:
char procName[12]{ "Hi" };
HANDLE hProc = NULL;
DWORD pID;
};
template <class datatype>
void wpm(datatype valToWrite, DWORD addressToWrite);
template <class datatype>
datatype rpm(DWORD addressToRead);
Vous essayez d'utiliser des méthodes dans la procédure de fenêtre. Le problème est que la procédure window est une fonction libre, c'est-à-dire qu'elle n'a pas cet objet, mais seulement un HWND
handle. Vous devez d'abord identifier l' Window
objet pour lequel la procédure de fenêtre est appelée.
Une méthode courante consiste à SetWindowLongPtr
stocker un pointeur vers l'objet C++ dans la mémoire supplémentaire de la fenêtre. Ensuite, vous pouvez l'extraire et l'utiliser en toute sécurité dans la WndProc
fonction.
Comment:
réservez d'abord de la mémoire supplémentaire pour la fenêtre :
wc.cbWndExtra = sizeof(LONG_PTR);
passer un pointeur vers l'objet dans le lpParam
paramètre de CreateWindow
ouCreateWindowEx
m_hwnd = ::CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "MyWindowClass", "T3chSpl10ts",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT
, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, this);
//if creation fails return false
if (!m_hwnd)
return false;
stockez le pointeur dans cette mémoire supplémentaire lors du traitement du message WM_CREATE
ou WM_NCCREATE
pour l'utiliser ultérieurement dans WndProc :
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
Window *window = (Window *) GetWindowLongPtr(hwnd, 0);
CREATESTRUCT* cs;
...
case WM_CREATE:
cs = (CREATESTRUCT*)lParam;
::SetWindowLongPtr(hwnd, 0, (LONG_PTR) cs->lpCreateParams);
break;
case WM_COMMAND:
switch (LOWORD(wparam))
{
case ID_INJECT:
if (window->attachProc())
...
WM_NCCREATE
et WM_CREATE
sont les premiers messages envoyés à la fenêtre. L'initialisation du pointeur vers l'objet à ce moment permet de l'utiliser dans d'autres messages comme WM_SIZE
...
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots