I'm working on an anti-clicker in C++. My code works with all Programs that simulate Mouse Clicks, except for Programs which use code like this:
NativeMethods.SendMessage((IntPtr)processHandle, WM_LBUTTONDOWN, (IntPtr)1, (IntPtr)LParams(y, x));
My code:
while (TRUE) {
struct tagMSG Msg;
HHOOK Mouse = SetWindowsHookEx(WH_MOUSE_LL, MouseProcces, NULL, NULL);
while (GetMessage(&Msg, GameMainWindow, 0, 0)) {
Sleep(5000);
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
UnhookWindowsHookEx(Mouse);
}
LRESULT CALLBACK MouseProcces(INT NCode, WPARAM WParam, LPARAM LParam) {
if (WParam != WM_MOUSEMOVE && WParam != WM_MOUSEWHEEL)
{
std::cout << "click" << std::endl;
}
return CallNextHookEx(NULL, NCode, WParam, LParam);
}
Related
I've written a program to get keyboard hook. What I want is, when a user presses Enter, the typed text, for example: "hello world", which I stored in exportMsg, should be returned from the function.
I want to make a dll and export exportMsg.
Here is my code. Thanks in advance.
#include <Windows.h>
#include <stdio.h>
#include <iostream>
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK keyboardHook;
HWND prevWindow;
std::string exportMsg="";
int main()
{
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, 0, 0);
MSG msg{ 0 };
while (GetMessage(&msg, NULL, 0, 0) != 0);
UnhookWindowsHookEx(keyboardHook);
return 0;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
wchar_t title[256];
HWND fwindow = GetForegroundWindow();
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
//a key was pressed
if (wParam == WM_KEYDOWN && nCode == HC_ACTION )
{
//return if enter pressed
if (key->vkCode == '\r')
{
std::cout << exportMsg << std::endl;
}
else
{
exportMsg.push_back(key->vkCode);
}
}
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
As std::cin doesn't work in Unity, I needed to use Keyboard Hook to scan qrCode through a QR Code Scanner Machine and send the scanned string to the Unity.
This algorithm capture the key strokes and returns the string when Enter is pressed.
My DLL code looks like this:
Header file:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK keyboardHook;
HWND prevWindow;
std::string exportMsg = "";
QRCODEREADER_EXPORTS_API void StartHook(char* str, int strlen);
Source file:
QRCODEREADER_EXPORTS_API void StartHook(char* str, int strlen)
{
string result;
cout << "please scan the QR code!!!\n";
//std::cin >> result;
exportMsg.clear();
HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);
if (!keyboardHook) {
std::cout << "Failed to hook keyboard\n";
}
else {
MSG msg{ 0 };
while (GetMessage(&msg, NULL, 0, 0) != 0);
result = exportMsg;
cout << "your data: " << result << "\n";
result = result.substr(0, strlen);
//str = new char[result.length()];
std::copy(result.begin(), result.end(), str);
str[min(strlen - 1, (int)result.size())] = 0;
}
std::cout << "Quitting...\n";
UnhookWindowsHookEx(keyboardHook);
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND fwindow = GetForegroundWindow();
PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
//a key was pressed
if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
{
//return if enter pressed
if (key->vkCode == '\r')
{
std::cout << exportMsg << std::endl;
PostQuitMessage(0);
UnhookWindowsHookEx(keyboardHook);
}
else
{
exportMsg.push_back(key->vkCode);
}
}
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
dllmain:
int main() {
char* a;
for (int i = 0; i < 3; i++)
{
a = new char[50];
StartHook(a, 50);
cout<< i << "th iter: " << a << endl;
}
return 0;
}
I'm having some troubles hooking the process to read keypresses. GetLastError gives 0x7e which means module not found, though it seems I implemented the module finding thing correctly. What I currently have (PId is process id, ThreadId is main process thread id):
HWND hWindow = NULL;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD lpdwProcessId;
GetWindowThreadProcessId(hwnd, &lpdwProcessId);
if (lpdwProcessId == lParam)
{
hWindow = hwnd;
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK kbCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT kbdStruct = *((KBDLLHOOKSTRUCT *)lParam);
if (wParam == WM_KEYDOWN) {
if (kbdStruct.vkCode = VK_F1) {
std::cout << "f1 was pressed" << std::endl;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
...
EnumWindows(EnumWindowsProc, initt.PId);
HHOOK hKbdHook = SetWindowsHookEx(WH_CALLWNDPROC, kbCallback, (HINSTANCE)GetWindowLongPtr(hWindow, GWLP_HINSTANCE), initt.ThreadId);
}
I use this code for the main loop (my function):
while (running)
{
if(is_close)
{
Log().push_log("close", "message close!", logInfo);
running = active = false;
break;
}
while (PeekMessage(&msg, g_hWnd, 0, 0, PM_REMOVE))
{
std::cout << "Wnd: " << msg.message << std::endl;
if (msg.message == WM_QUIT || msg.message == WM_DESTROY || msg.message == WM_CLOSE)
{
MessageBox(0, "Hello, World", "Hello", MB_OK);
running = false;
}
// TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (running && active)
render.DrawObject(g_hDC);
}
Well, then I use WndProc:
LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
std::cout << "Wnd Proc: " << msg << std::endl;
return DefWindowProc(hWnd, msg, wParam, lParam);
}
When I'm trying to get the message WM_QUIT, WM_DESTROY, or WM_CLOSE in my function, it does not work. My function does not see messages.
How can I get this message?
PeekMessage or GetMessage will only return messages that were posted to the message queue with PostMessage(). That will never be WM_CLOSE or WM_DESTROY, those messages are sent with SendMessage(), directly delivered to the window procedure and don't go in the message queue. You won't get WM_QUIT unless you've got a PostQuitMessage() call in your code, you don't.
You really do have to write a window procedure for your main window. Simply handling WM_DESTROY and calling PostQuitMessage(0) should be enough.
LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_DESTROY) PostQuitMessage(0);
return DefWindowProc(hWnd, msg, wParam, lParam);
}
You'll now get WM_QUIT in your game loop.
I am trying to intercept mouse wheel by child windows under cursor. But something is wrong. It seems like message sends many times. What did I do wrong?
LRESULT CALLBACK MouseProc(__in int nCode,
__in WPARAM wParam,
__in LPARAM lParam)
{
LRESULT ret = 0;
static BOOL b = TRUE;
if (wParam == WM_MOUSEWHEEL)
{
if (b)
{
MOUSEHOOKSTRUCTEX *pMhs = (MOUSEHOOKSTRUCTEX *)lParam;
short zDelta = HIWORD(pMhs->mouseData);
POINT pt;
GetCursorPos(&pt);
LPARAM lParam = MAKELPARAM(pt.x, pt.y);
HWND hWnd = WindowFromPoint(pt);
b = FALSE;
SendMessage(hWnd, WM_MOUSEWHEEL, zDelta, lParam);
}
else
{
b = TRUE;
}
ret = 1;
}
else
{
CallNextHookEx(0, nCode, wParam, lParam);
}
return ret;
}
I need to remap some of keys like Left Alt but i just disable it so code for disable Left Alt look like this:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;
if (p->vkCode == VK_LMENU) return 1;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
So I try to remap Left Alt to Left Ctrl and use function like keybd_event and SendMessageA but didn't get nothing.
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;
if (p->vkCode == VK_LMENU)
{
keybd_event(VK_CONTROL, 0, 0, 0);
// or use this is sameSendMessageA(0, WM_KEYUP, VK_CONTROL, 0);
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
How to remap Left Alt to Left Ctrl?
This is a way to remap Alt to Ctrl works great. Don't forget the default parameter
switches back to alt if you do not define wParam may just be my computer well give it a try
include iostream
include windows.h
using namespace std;
HHOOK hHook = 0;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;
if (p->vkCode == VK_LMENU) // VK_LMENU = ALT key
{
switch (wParam){
case WM_SYSKEYDOWN :{ // use SYSKEYDOWN
cout << "Key down" << endl;
keybd_event(VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | 0, 0 );
break;
}
case WM_KEYUP: // use regular keyup
{
cout << "Key up" << endl;
keybd_event( VK_LCONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
return 1;
break;
}
default:
wParam = WM_SYSKEYDOWN; // if you do not specify it changes back to alt
break;
}
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, &LowLevelKeyboardProc, hThisInstance, NULL);
if (hHook == NULL)
{
cout << "Error" << endl;
return 1;
}
MSG messages;
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}