Articles of winapi

标准用户login时启动pipe理交互式进程

我有一个系统服务,以pipe理员身份创build一个辅助交互过程,以便访问一些与桌面相关的资源,包括无法从服务运行的BlockInput()函数和NVIDIA的NVAPI函数。 当login用户是pipe理员的成员时,以下工作: 设置权限级别,包括SE_TCB_NAME 使用WTSGetActiveConsoleSessionId()获取活动的会话ID 使用WTSQueryUserToken()从会话ID获取login用户 带有TokenLinkedToken的GetTokenInformation() DuplicateTokenEx()与SecurityImpersonation 使用CreateProcessAsUser()启动进程 但是,当我有当前login会话是一个标准的用户而不是pipe理员中的一个,步骤4.失败,大概是因为标准用户没有与它链接的pipe理级别令牌。 这里有什么解决scheme? 我假设我需要得到一个pipe理员用户的令牌,但我该怎么做呢? 如果该用户不是login的用户,它是否仍然可以访问与当前桌面交互的function?

EnumDisplayDevices与WMI Win32_DesktopMonitor,如何检测活动监视器?

对于我当前的C ++项目,我需要为大量计算机上连接并激活的每个监视器检测唯一的string。 研究指出了2个select 使用WMI并查询所有活动监视器的Win32_DesktopMonitor。 使用PNPDeviceID来唯一标识显示器。 使用EnumDisplayDevices API,并挖掘获取设备ID。 我有兴趣使用设备ID进行独特的模型识别,因为使用默认即插即用驱动程序的监视器将报告一个通用string作为监视器名称“默认即插即用监视器” 我一直在遇到与WMI方法有关的问题,它似乎只在我的Vista机器上返回1个显示器,看着doco,结果表明它在非WDDM设备上无法正常工作。 EnumDisplayDevices在从后台服务(尤其是Vista)运行时似乎有点麻烦,如果它在会话0中,它将不返回任何信息。 有没有其他人不得不做类似的事情(find所有连接的主动显示器独特的模型string?) 哪种方法效果最好?

WinRT和内置的Windows 8应用程序

非新城Windows应用程序(例如:资源pipe理器)可以用新的WinRT构build,还是必须是基于Win32的?

使用ShellExecuteEx并捕获标准in / out / err

我正在使用ShellExecuteEx来执行C中的命令。有没有办法使用ShellExecuteEx和捕获标准in / out / err? 注意:我不想使用CreateProcess 。

寻找一个可靠的Forms.Screen.DeviceName映射到监视EDID信息

我正在开发一个应用程序,该应用程序将在相应的显示器上的对话框中显示来自EDID块(监视器型号,ID,S / N等)的信息。 此代码适用于查找显示器的EDID信息。 它通过枚举HKLM \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY \ [Monitor] \ [PnPID] \ Device Parameters \ EDID下的DISPLAY键来提取EDID信息。 更新:上面的代码是依靠PnP使用registry的“副作用”。 我现在正在使用SetupAPI枚举监视器,它可以正确处理监视器的连接/删除(不像上面链接的代码)。 我试图关联Windows.Forms.Screen.AllScreens [](\\。\ DISPLAY1,\\。\ DISPLAY2等)中的每个屏幕与从上面的registry检查返回的条目。 注意:在下面的代码块中,DisplayDetails.GetMonitorDetails()现在已经被使用SetupAPI的更健壮的registry枚举代码replace,但返回的数据是相同的。 例如 private void Form1_Load(object sender, EventArgs e) { Console.WriteLine("Polling displays on {0}:", System.Environment.MachineName); int i = 0; foreach ( DisplayDetails dd in DisplayDetails.GetMonitorDetails()) { Console.WriteLine( "Info: […]

如何获取exception的名称/描述?

如何获得SEHexception的名称和/或描述, 而不必将string硬编码到应用程序中? 我尝试使用FormatMessage() ,但是它有时会截断消息,即使您指定忽略插入: __asm { // raise access violation xor eax, eax mov eax, [eax] } 引发exception,代码为0xC0000005 (EXCEPTION_ACCESS_VIOLATION) 。 char msg[256]; FormatMessageA(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandleA("ntdll.dll"), 0xC0000005, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), msg, sizeof(msg), NULL); 用截断的string填充msg :“ The instruction at 0x ”。

如何确定当前窗口是否为活动窗口?

我怎么知道我的窗口是否是当前活动的窗口? 我目前的猜测是做GetForegroundWindow并比较HWND与我的窗口。 有没有比这更好的方法? 我正在使用Win32 API / MFC。

如何在Windows 7 Aero任务预览中创build自己的控件?

我有两个有关Windows 7任务预览的问题。 在Delphi中,我想在下面的屏幕截图中突出显示的区域内创build自己的button。 1)是否有可能在任务预览窗口(在Windows 7中)创build我自己的控件,如Winamp可以做的? 或者这只是一些有限的多媒体扩展? 2)如果可以绘制自己的button,我应该从哪里开始? 示例或Windows API指南对我有帮助。 非常感谢

在winapi中以最低的权限运行进程

我写的东西类似于http://ideone.com/ 。 目前我正在用CreateProcess调用运行用户进程。 如果运行时间超过指定的时间,我会终止进程,但是我不知道如何拒绝读/写文件系统权限/创build进程权限等等。 给定的可执行文件可以从字面上任何东西,我只需要只允许标准input/标准输出。 如果我可以设置工作记忆,那也是很好的。 我读了很多关于msdn的文章,比如CreateProcessAsUser Function , CreateProcessWithLogonW Function等,但是我很困惑(可能是因为我的win32知识非常有限)。 只需调用CreateProcessAsUser并使用这些有限权限(以及如何创build此用户)创build特殊用户即可。 我希望我能用一个正确的参数在一个函数调用中实现这一点,所以请帮助。 另外,如果你知道一些类似的开源项目,那就太好了。 谢谢。 ================================================== ======== 编辑:嗨再次:)我仍然坚持这一点。 我没有足够的时间来处理这个问题,但我猜snemarch post是非常有用的。 如果有人开箱即用的解决scheme,那就太好了。 如果我用snemarch的链接做什么,我会发布。

如何检测我的程序可用的堆栈空间量?

我的Win32 C ++应用程序充当一个RPC服务器 – 它具有一组处理请求的函数,RPC运行时创build一个单独的线程并在该线程中调用我的一个函数。 在我的函数中,我有一个std :: auto_ptr用于控制编译时已知大小的堆分配char []数组。 它用VC ++编译的时候意外的工作,但根据C ++标准是未定义的行为,我想摆脱它。 我有两个select:std :: vector或一个堆栈分配的数组。 因为我不知道为什么有一个堆分配的数组,我想考虑用一个堆栈分配的数组replace它。 数组是10k个元素,如果RPC运行时产生一个非常小的线程,我可以假设地面对堆栈溢出。 我想检测多less堆栈空间典型地分配给线程和多less可用于我的function(其被调用者肯定会消耗一些分配的空间)。 我怎么能这样做?