个人的 windows 下小程序

简介:

个人写的一些windows下小程序,主要用于解决自己用windows时候遇到的一些问题。

一、关闭显示器

一行代码用于解决小米笔记本fn键没有关闭显示器这一个选项:

用法:直接双击运行即可。

#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)

{
    SendMessage((HWND)0xffff, 0x112, 0xF170, 2);
    return 0;
}

 二、GTA5 键盘开飞机

用于解决在没有小键盘的笔记本电脑上,使用键盘开飞机的问题:

用法:打开GTA5后,运行 inst.exe 安装,使用:O、K、L、; 四个键开飞机:O->8,K->4,L->5,;->6,程序运行完即卸载。

//inst.exe
#include <stdio.h>
#include <Windows.h>

int main()
{
    Sleep(2000);

    HWND gta5_wnd = ::FindWindow("grcWindow", "Grand Theft Auto V");
    if (gta5_wnd == NULL) {
        puts("GTA 5 没有运行!\n");
    }
    else {
        DWORD id = ::GetWindowThreadProcessId(gta5_wnd, NULL);
        printf("找到了 GTA5 主线程,线程 id 为: %d\n\n", id);
        if (id != NULL) {
            HMODULE DllModuleHandle = ::LoadLibrary("Dll1.dll");
            if (DllModuleHandle == NULL) {
                puts("钩子 DLL 丢失!\n");
                goto END;
            }
            HOOKPROC FuncAddress = (HOOKPROC)GetProcAddress(DllModuleHandle, "KeyboardProc");
            if (FuncAddress == NULL) {
                puts("找不到钩子函数!\n");
                goto END;
            }
            HHOOK HookHandle = SetWindowsHookEx(WH_KEYBOARD, FuncAddress, DllModuleHandle, id);
            if (HookHandle == NULL) {
                puts("安装钩子 Dll 失败了!建议关闭杀毒软件!\n");
                UnhookWindowsHookEx(HookHandle);
            }
            else {
                puts("钩子 Dll 安装已经成功!按任意键卸载!\n");
                system("pause");
                UnhookWindowsHookEx(HookHandle);
            }
        }
        else {
            puts("出错了! \n");
        }
    }
END:
    puts("程序已经结束,按任意键关闭这个窗口\n");
    system("pause");
    return 0;
}
// dllmain.cpp : 定义 DLL 应用程序的入口点。
//Dll1.dll
#include "stdafx.h"

void sendKey(int keycode, bool tag)
{
    INPUT key;
    memset(&key, 0, sizeof(INPUT));
    key.type = INPUT_KEYBOARD;
    key.ki.dwExtraInfo = GetMessageExtraInfo();
    key.ki.wScan = static_cast<WORD>(MapVirtualKeyEx(keycode, MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));
    key.ki.dwFlags = KEYEVENTF_SCANCODE;
                                        
    if (!tag) {
        SendInput(1, &key, sizeof(INPUT)); //按下
    }
    else {
        key.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; //弹起
        SendInput(1, &key, sizeof(INPUT));
    }
}

extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0) {
        return ::CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    switch (wParam) {
    case 0x4F: //O key 下 8
        sendKey(VK_NUMPAD8, lParam & 0x80000000);
        break;
    case 0x4C: //L key 上 5
        sendKey(VK_NUMPAD5, lParam & 0x80000000);
        break;
    case 0x4B: //K key 左 4
        sendKey(VK_NUMPAD4, lParam & 0x80000000);
        break;
    case 0xBA: //; key 右 6
        sendKey(VK_NUMPAD6, lParam & 0x80000000);
        break;
    default:
        break;
    }
    return ::CallNextHookEx(NULL, nCode, wParam, lParam);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

猜你喜欢

转载自www.cnblogs.com/plain8/p/9292983.html
今日推荐