小编Ase*_*esh的帖子

C++ 键盘钩子 - 参数 nCode 是什么意思?

我正在寻找为 C++ 项目编写一个键盘钩子。我找到了一些代码,但在没有完全理解它的情况下不想使用它:

HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int ncode, WPARAM wParam, LPARAM lparam)
{
    if(ncode>=HC_ACTION)
    {
        if((wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN))
        {
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            DWORD dwMsg = 1;
            dwMsg += kbdStruct.scanCode << 16;
            dwMsg += kbdStruct.flags << 24;
            char key[16];
            GetKeyNameText(dwMsg,key,15);
            
            if((GetKeyNameState(VK_CAPITAL)& 0x0001) == 0)
            {
                for (int i=0; i<10)key[i] = tolower(key[i]);
                ReturnKeyPressed(key);
            }
            else
            {
                ReturnKeyPressed(key);
            }
        }
    }
    return CallNextHookEx(_hook,nCode,wParam,lParam);
}
void SetHook()
{
    _hook = SetWindowsHookEx(WH__KEYBOARD_LL,HookCallback,Null,0);
}
Run Code Online (Sandbox Code Playgroud)

我不明白 nCode 是什么。其他参数从哪里来?来自绝对 C++ 初学者的问候:)。

c++ keyboard hook winapi keylogger

3
推荐指数
1
解决办法
1082
查看次数

无法关闭 OPENFILENAME

我使用 OPENFILENAME 和函数 GetOpenFileName() 通过 Windows 文件浏览器获取文件位置。

问题是当我想删除所选文件夹时(当程序运行并且我需要执行此操作时)窗口显示错误:“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开”

我知道为什么会这样做,但我不知道如何在运行时关闭该文件

提前致谢。

编辑 :

//Opening Save file
    TCHAR *filter = _T("Story File(*.Strory*)\0*.Story*\0");
    HWND owner = NULL;

    OPENFILENAME ofn;
    TCHAR fileName[MAX_PATH] = _T("");
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = _T("");

    if (GetOpenFileName(&ofn))
    {

    }
Run Code Online (Sandbox Code Playgroud)

这段代码是我创建和使用 OPENFILENAME 变量的地方,GetOpenFileName() 会自动将所选文件锁定为“在程序中打开”,并防止在程序运行时对文件夹进行任何修改(例如删除或重命名)。但我想禁用这个属性。

c++ winapi file getopenfilename

1
推荐指数
1
解决办法
698
查看次数

`0x2` 是 C++ 中的空指针吗?

在以下代码中:

int* p = (int*)0x2;
*p = 1;
Run Code Online (Sandbox Code Playgroud)

此代码导致分段错误。但:

int* p = (int*)0x2;
cout << (p == nullptr);
Run Code Online (Sandbox Code Playgroud)

输出是0。所以:

  1. 指向地址的指针是否0x2真的是空指针(这会导致分段错误)?
  2. 我如何处理0x2if 语句之类的情况?(我的意思是,处理取消引用会导致分段错误的情况。因为在if (p == nullptr)这种情况下没有处理)。
  3. 除了0x2取消引用指向它们的指针会导致分段错误之外,还有哪些地址?为什么?

c++ pointers segmentation-fault

1
推荐指数
1
解决办法
401
查看次数

通过映射到的地址将文件名映射到内存中

假设有以下代码 -

HANDLE h = CreateFile(L"some_dll.dll", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE,
    NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE map = CreateFileMapping(h, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
LPVOID res = MapViewOfFileEx(map, 0, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

是否有可能使用c ++提取'some_dll',给定它映射到的地址?

当尝试使用windbg调试此可执行文件时,似乎它也不能很好地提取模块

在此输入图像描述

c c++ memory windows winapi

0
推荐指数
1
解决办法
396
查看次数

将major.minor.build.patch格式的版本转换为整数

如何将包含此格式版本的字符串转换55.2.2883.95为整数?我正在修改开源Omaha服务器,它将输入版本号存储为PostgresSQL中的大型int类型.例如,如果输入版本字符串是,55.2.2883.95那么它在db中的相应值存储为60481918402655.

谢谢

python django django-models

-1
推荐指数
1
解决办法
231
查看次数