Tag: winapi

如何在Rich Edit控件(Win32 / C)中更改下划线颜色

我正在寻找一种方法在Rich Edit控件中使用红色波浪形下划线(我使用的是带有Msftedit.dll的4.1版本)。 我可以使用以下代码生成波浪形下划线: CHARFORMAT2 format; format.cbSize = sizeof(format); format.dwMask = CFM_UNDERLINETYPE; format.bUnderlineType = CFU_UNDERLINEWAVE; SendMessage(hWndEdit,EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format); MSDN文档未指定如何更改下划线的颜色,仅指定文本(带下划线)和文本背景。 我发现了一些代码,它们使用较低的半字节作为下划线类型(CFU_UNDERLINEWAVE),而较高的字母表示颜色。 所以我试过了: format.bUnderlineType = CFU_UNDERLINEWAVE | 0x50; 但这不起作用。 UPDATE 我已经使用3.0版(Riched20.dll)测试了这段代码并且它正在运行。 所以问题在于4.1。 该function是否已删除或移至其他位置? 它也不适用于版本6(office 2007使用的dll)。

有没有更好的方法来删除标题栏上的所有三个按钮并使用Windows API删除滚动条?

下面列出了删除标题栏上所有三个按钮并删除我在“Windows 7”中使用的滚动条的代码: #define WINVER 0x0501 // WinXP and UP #include int main ( void ) { //Get a console handle HWND ConsoleWindow = GetConsoleWindow(); //Change Settings SetWindowLong (ConsoleWindow, GWL_STYLE, WS_THICKFRAME); SetWindowLong (ConsoleWindow, GWL_STYLE, WS_CAPTION); SetWindowPos (ConsoleWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_SHOWWINDOW); //Resize system (“mode con cols=75 lines=50”); system (“pause>nul”); return 0; } […]

获取上次激活窗口的窗口句柄

我正在开发一个位于系统托盘中的应用程序,可以在活动窗口上执行操作。 但是,当单击系统托盘中的图标时, GetForegroundWindow()将返回任务栏。 我需要在任务栏之前获得活动的窗口。 我尝试使用EnumWindows和GetWindow枚举桌面窗口,但这通常会打开桌面小工具和其他最不活跃的顶级项目。 是否可能,或者当窗口停用时信息完全丢失?

对于具有UIAccess =“true”的进程,CreateProcessAsUser失败并显示ERROR_ELEVATION_REQUIRED

我正在尝试使用以下代码从我的服务应用程序(作为local system运行)运行用户模式进程。 用户模式进程的要求是在没有提升的情况下运行,但要在其清单中使用UIAccess=”true” ,以便能够在Windows 8下正确显示top-most窗口 。 所以我这样做(从我的服务)来运行我的用户模式过程: //NOTE: Error checking is omitted for readability //’dwSessionID’ = user session ID to run user-mode process in //’pUserProcPath’ = L”C:\\Program Files (x86)\\Company\\Software\\user_process.exe” HANDLE hToken = NULL; WTSQueryUserToken(dwSessionID, &hToken); HANDLE hToken2; DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken2); LPVOID pEnvBlock = NULL; CreateEnvironmentBlock(&pEnvBlock, hToken2, FALSE); STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb […]

删除文件而不是将其标记为删除

我正在为Windows编写一个服务(从XP到8.1)。 我需要以递归方式删除文件夹,然后使用DeleteFile和RemoveDirectory 。 我不想使用SHFileOperation因为它具有MAX_PATH限制。 问题是,有时, RemoveDirectory失败并显示ERROR_DIR_NOT_EMPTY ,即使该目录为空。 我发现这是因为DeleteFile异步工作,它只“标记”一个文件进行删除。 因此,在调用RemoveDirectory之前添加一个小延迟(Sleep)可以解决问题。 但我正在寻找一种更清洁的方法。 那么,有没有办法确保标记的文件被正确删除? 我已经尝试直接在目录上调用FlushFileBuffers ,但没有成功。 编辑:有些人声称即使有句柄打开, NtDeleteFile也可以删除文件。 我刚刚检查过它,这是错误的,至少在Windows 8.1上:只有当所有句柄都关闭时才会删除文件。

根据磁盘ID删除文件

如此处所述,使用带有FILE_DISPOSITION_INFO允许设置具有打开句柄的文件,以便在关闭所有句柄时删除该文件。 但是,我试图根据文件索引(磁盘ID)删除文件,该文件由FILE_DISPOSITION_INFO和OpenFileById检索,以便安全地删除目录中只有大小写不同的文件/目录。 这在我的用例中是安全的,因为在NTFS系统上,文件索引在删除之前是持久的 ,否定当前代码库处理的ReplaceFile的使用。 但是,在尝试删除句柄时,我收到错误87( ERROR_INVALID_PARAMETER )。 如果我使用CreateFileW创建的句柄删除,我没有遇到任何问题。 但是,我无法做到这一点,因为Windows无法区分同一案例的两个文件/文件夹,即使NTFS可以。 我也知道,使用OpenFileById打开的硬链接文件存在歧义,因为硬链接文件共享相同的磁盘ID。 可以认为硬链接文件的问题与此方案无关。 我只会按ID删除目录,不能硬链接。 我的OpenFileById调用中是否缺少参数或设置? 不知何故,在我的SetFileInformationByHandle调用? 我试过的其他方法: 使用OpenFileById句柄调用DuplicateHandle ,为dwDesiredAccess提供DELETE ,并使用它。 相同的ERROR_INVALID_PARAMETER结果。 将ReOpenFile与OpenFileById句柄dwDesiredAccess使用,为dwDesiredAccess提供DELETE ,并使用它。 相同的ERROR_INVALID_PARAMETER结果。 将ReOpenFile与OpenFileById句柄一起使用,为dwDesiredAccess提供DELETE ,并提供FILE_FLAG_DELETE_ON_CLOSE标志。 没有给出错误,但在关闭所有句柄后文件仍然存在。 这是一个最小但完整的例子,它可以重现这个问题: #include #include #include DWORD getFileID(LPCWSTR path, LARGE_INTEGER *id) { HANDLE h = CreateFileW(path, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS, 0); if (h == INVALID_HANDLE_VALUE) return GetLastError(); […]

win32应用程序不是那么面向对象,为什么有这么多指针?

对于你们中的一些人来说这可能是一个愚蠢的问题,也许我对这个问题提出了错误,因为我是c ++的新手。 但是我注意到在使用很多win32应用程序时,你会使用大量的指针资源。 为什么必须总是获取对象指针? 为什么不发起一个新的类实例。 说到这一点,我注意到在大多数情况下你永远不会发起新对象,但总是调用返回该指针的方法。 如果该指针正在其他地方使用该怎么办? 如果你改变那个指针并且它正在其他地方被使用,你不能弄乱一些东西。

我可以在用户模式下获得Vista和Windows 7下的原始磁盘扇区的写入权限吗?

来自RawDisk网站 : Windows Vista的新安全模型严格限制在用户模式下执行的应用程序。 即使具有提升的管理权限,应用程序也无法获得对原始磁盘扇区的写入权限。 这是真的? 来自Microsoft doc : 如果未装入卷或卷没有文件系统 ,则对文件系统和存储堆栈的更改 不适用 。 请给 要么是官方Microsoft文档的链接,要么确认RawDisk网站 或者一个有效的代码示例。 (如果设置了GENERIC_WRITE ,我显然无法创建一个, CreateFile()调用失败, ERROR_ACCESS_DENIED 。) 到目前为止我发现的其他相关Microsoft文档: 阻止对卷和磁盘的直接写入操作 SL_FORCE_DIRECT_WRITE处的SL_FORCE_DIRECT_WRITE SL_FORCE_DIRECT_WRITE处的SL_FORCE_DIRECT_WRITE 结构

如何区分左右键(CTRL和ALT)?

我开始利用Win32的原始输入function来检测键盘上的所有键。 到目前为止,一切都很好! 我可以区分顶行的数字和右侧键盘的数字。 我甚至可以在左右键之间进行检测。 但是,control和alt键不会返回唯一的扫描码。 控制键返回29,并且alt键返回56。 检查这些键上的键状态的流行方法是GetAsyncKeyState 。 我已经使用VK_LCONTROL和VK_RCONTROL测试了该function,但它可以工作,但这只能帮助我捕获按键事件。 我真的希望能够捕获关键事件。 很明显,API在某种程度上意识到正在按下哪个键; 我如何获得这些信息? 我目前正在从RAWKEYBOARD结构的MakeCode字段中提取扫描代码。 这给了我关于除CTRL和ALT之外的每个键(及其左/右对齐)的信息。 我将如何捕获关键事件(并知道它是左/右)? 是否可以只使用RAWKEYBOARD结构? 或者我是否需要制定某种解决方法?

如何让我的应用程序使用Windows主题?

我正在使用一些Windows API来创建一个小应用程序。 我已经创建了按钮,窗口,好吧。 但问题是我创建的组件看起来不像操作系统主题。 它们看起来很简单: 请参阅按钮作为示例。 如何启用Windows主题? 它可以是C或Delphi。