我正在寻找为 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++ 初学者的问候:)。
我使用 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() 会自动将所选文件锁定为“在程序中打开”,并防止在程序运行时对文件夹进行任何修改(例如删除或重命名)。但我想禁用这个属性。
在以下代码中:
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。所以:
0x2真的是空指针(这会导致分段错误)?0x2if 语句之类的情况?(我的意思是,处理取消引用会导致分段错误的情况。因为在if (p == nullptr)这种情况下没有处理)。0x2取消引用指向它们的指针会导致分段错误之外,还有哪些地址?为什么?假设有以下代码 -
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调试此可执行文件时,似乎它也不能很好地提取模块
如何将包含此格式版本的字符串转换55.2.2883.95为整数?我正在修改开源Omaha服务器,它将输入版本号存储为PostgresSQL中的大型int类型.例如,如果输入版本字符串是,55.2.2883.95那么它在db中的相应值存储为60481918402655.
谢谢