Articles of winapi

find一个Windows用户的“真实”的应用程序数据文件夹?

我有一个Delphi 6应用程序,像大多数Windows应用程序一样,将数据读取/写入用户的“本地应用程序数据”文件夹。 我使用下面的代码来确定该文件夹。 到目前为止,该代码为我的大多数用户工作。 我遇到了本地应用程序数据不在预期文件夹中的用户: C:\Users\Bob\AppData\Roaming\ 通常,本地应用程序数据文件夹parsing为: C:\Documents and Settings\Bob\Application Data\ 这个用户特殊情况的奇怪之处在于通常在HKEY_LOCAL_MACHINE中find的几个registry项实际上位于HKEY_CURRENT_USER中。 他们在Windows 7上运行。 缺乏一个更好的词,有没有办法让用户“真正”的应用程序数据,所以我可以更好地浏览这种情况? 如果是在CSIDL_APPDATA,CSIDL_COMMON_APPDATA和CSIDL_LOCAL_APPDATA特殊文件夹之间进行智能select,那么这样做的逻辑是什么? 正如您所看到的,我正在寻找一种通用function,无论用户正在运行的Windows版本或其特定的PCconfiguration如何,都可以find正确的应用程序数据文件夹。 我发现这个堆栈溢出post似乎有答案,但它使用.NET库中的函数,我正在使用Delphi 6.如果这个解决scheme回答我的问题,有人可以告诉我一个快速的方法来复制它在Delphi中: 我怎样才能得到当前用户的“应用程序数据”文件夹的path? // Function to get the app data special folder. function GetAppdataFolder: string; begin Result := GetSpecialFolderLocation(CSIDL_APPDATA); end;

WinAPI C ++:重新编程窗口resize

我有一个窗口,我想要实现边界的调整边界,就像任何其他窗口。 从意见和答复中收集build议,我重写了我的代码。 对于WM_GETMINMAXINFO我有: MINMAXINFO *min_max = reinterpret_cast<MINMAXINFO *>(lparam); min_max->ptMinTrackSize.x = MINX; min_max->ptMinTrackSize.y = MINY; MINX和MINY是我希望窗口的最小尺寸。 对于WM_NCHITTEST我有: RECT wnd_rect; int x, y; GetWindowRect (window, &wnd_rect); x = GET_X_LPARAM (lparam) – wnd_rect.left; y = GET_Y_LPARAM (lparam) – wnd_rect.top; if (x >= BORDERWIDTH && x <= wnd_rect.right – wnd_rect.left – >BORDERWIDTH && y >= BORDERWIDTH && y <= […]

Windows 8.1之后的WinAPI弃用

我一直在使用GetVersionEx ,它在运行Windows 8.1的机器上失败 。 查看一些信息发现GetVersionEx从8.1版本开始。 我想问哪里可以find完整的弃用API列表,因为我不想再使用它了。 编辑:我不是问什么,而不是GetVersionEx ,我要求一个完整的不赞成使用的API列表。

修改GetCommandLine()的命令行参数

我试图修改我的可执行文件的命令行参数,以便GetCommandLine()将返回我设置的string。 由于我想在任何人之前修改命令行值,我已经通过/ ENTRY开关将我的入口点改为testme()函数,并且还设置了/ NODEFAULTLIB选项以排除CRT。 使用下面的代码为什么我可以通过CommandLine更改string缓冲区指针,但不能分配一个全新的缓冲区? 代码: #include <Windows.h> #include <winternl.h> typedef NTSTATUS (WINAPI *PFN_NtQueryInformationProcess)( IN HANDLE ProcessHandle, IN PROCESSINFOCLASS ProcessInformationClass, IN PVOID ProcessInformation, IN ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength ); int testme() { // Get PEB block address PROCESS_BASIC_INFORMATION pbi; ULONG result; PFN_NtQueryInformationProcess pfnQueryProcess = (PFN_NtQueryInformationProcess) GetProcAddress(LoadLibrary("ntdll"), "NtQueryInformationProcess"); pfnQueryProcess(GetCurrentProcessId(), ProcessBasicInformation, &pbi, sizeof(pbi), &result); // Modify […]

按名称获取C进程ID

我试图通过进程名称(例如, notepad.exe )获取进程ID,但StackOverflow上的以前的解决scheme似乎不能正常工作。 这是我试过的: DWORD FindProcessId(const char *processname) { HANDLE hProcessSnap; PROCESSENTRY32 pe32; DWORD result = NULL; // Take a snapshot of all processes in the system. hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hProcessSnap) return(FALSE); // Retrieve information about the first process, // and exit if unsuccessful if (!Process32First(hProcessSnap, &pe32)) { CloseHandle(hProcessSnap); // clean […]

如何在工作线程(非UI线程)中创buildmodal dialog?

我写了一个示例MFC应用程序,其中有两个线程: – 主线程(UI线程) – 工作线程(非UI线程) 我有一个特定的要求,在非UI(工作线程)中创build一个Modal对话框。 当我创buildCDialog对象并调用DoModal时,它就可以工作。 对话框被创build并作为应用程序的模态。 (Win XP SP2机器)但是这在Windows 2003服务器机器上不起作用。 在2003服务器的行为是,modal dialog在应用程序主窗口后面,只有当我点击主窗口时,对话框才会被带到前面。 它不作为我的应用程序的modal dialog。 可能是什么问题 – 有什么想法? 如果在非UI线程中创buildUI控件是问题,那么是否有任何Win32 API将允许我将我的工作线程链接到主UI线程,使得DoModal在主线程中发生。 我试过AttachThreadInput,但它不工作。

如何获取当前键盘布局的代码页?

我的非Unicode应用程序需要能够处理Unicode键盘input(WM_CHAR /等),从而接收8位字符代码,然后在内部将其转换为Unicode。 9x兼容性是必需的,所以使用大多数Unicode API不是一个选项。 目前,它查看PRIMARYLANGID(GetKeyboardLayout(0))返回的语言,并在硬编码表中查找相关代码页。 我找不到一个函数来获取特定语言或键盘布局使用的代码页。 然后可以使用MultiByteToWideChar来转换字符/string。 有没有办法获得当前的键盘布局的代码页? GetACP返回默认的系统代码页面,不受当前键盘布局的影响。

通过UpdateResource更新STRING TABLE(添加多个string)

可能重复: 使用UpdateResource更新string表 我想通过UpdateResources更新二进制string表,目前,我的代码只添加一个string,但我想要它添加多个条目到string表。 这是我的代码: HANDLE hRes = BeginUpdateResource("file.exe",TRUE); if (hRes) { char * sNewString = "Line"; int iCharCount = (strlen(sNewString) + 1); //sNewString.size() + 1; LPWSTR pUnicodeString = new WCHAR[iCharCount]; if (!pUnicodeString) { cout << "Error" << endl; } DWORD dwUnicodeCharCount = MultiByteToWideChar(CP_ACP,NULL,sNewString,-1,pUnicodeString,iCharCount); HGLOBAL hGlob = GlobalAlloc(GHND,(dwUnicodeCharCount + 4) * sizeof(WCHAR)); LPWSTR pBufStart = (LPWSTR)GlobalLock(hGlob); […]

使用Windows监视器configurationfunction时发生I2C错误

我试图通过Windows API获取/设置显示器的亮度级别。 我已经尝试了低级监视器configuration函数和高级监视器configuration函数 ,但它们似乎都在同一个地方。 在这两种情况下,获取HMONITOR句柄并从HMONITOR获取物理监视器句柄都没有问题,但是一旦我尝试查询DDC / CIfunction,就会出现一个错误消息,提示“ An error occurred while transmitting data to the device on the I2C bus. 导致此错误的特定函数是高级函数的GetMonitorCapabilities和低级函数的GetCapabilitiesStringLength 。 他们都造成相同的错误。 这使我相信,也许我的显示器不支持DDC / CI,但我知道我的笔记本电脑的显示器亮度可以通过控制面板进行更改,所以它必须通过软件以某种方式控制。 另外,我可以在PowerShell脚本中成功使用WMI类来获取/设置本页所述的亮度。 我读过的大部分内容都表明,大多数现代笔记本电脑屏幕都支持DDC / CI。 有什么办法找出是什么原因导致这个错误或获得更多的信息呢? 我目前正在Windows 7的Visual Studio 2013中使用C ++。如果我无法得到这个当前的方法,我可能会在我的C ++程序中使用WMI,但是我想我会先问一下。 这是我现在的代码: #include "stdafx.h" #include <windows.h> #include <highlevelmonitorconfigurationapi.h> #include <lowlevelmonitorconfigurationapi.h> #include <physicalmonitorenumerationapi.h> #include <iostream> #include <string> int _tmain(int argc, […]

使用FILE_ATTRIBUTE_TEMPORARY和FILE_FLAG_DELETE_ON_CLOSE

我在创buildC ++应用程序中的临时文件时使用了两个标志FILE_ATTRIBUTE_TEMPORARY和FILE_FLAG_DELETE_ON_CLOSE 。 根据这个博客 ,不应该在磁盘上创build任何文件。 但在我的代码中,文件被创build并写入到磁盘上(即使是1 KB数据)。 有人可以确认这些标志的确切function,以及文件是否在磁盘上创build?