Articles of winapi

WTSEnumerateProcesses和terminal服务服务

调用WTSEnumerateProcesses()时,我的Windows服务偶尔会报告以下错误: 绑定句柄无效。 我怀疑这是由于无法使用terminal服务服务而引起的,尽pipe我已将terminal服务服务注册为我的服务的从属服务。 我相信,即使terminal服务服务正在运行,它还没有完成初始化(或正在closures),并且无法处理任何请求,从而导致错误。 我注意到WTSRegisterSessionNotification()的参考文档中的以下内容: Global \ TermSrvReadyEvent全局事件设置时,所有相关服务已启动,并且可以成功调用此函数。 这不会出现在WTSEnumerateProcesses()的文档中,但它同样适用? 意味着在Global\\TermSrvReadyEvent上尝试OpenEvent()会指示terminal服务服务实际上可用? 平台:Windows XP,Windows Vista和Windows 7

谁可以写入分配的地址?

我在Delphi中使用VirtualAllocEx在外部进程中保留内存,如下所示: var p : pointer; begin p := VirtualAllocEx(Process, nil, SizeOf(Integer), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); end; ProcessHandle之前已经用PROCESS_ALL_ACCESS 。 之后,我的程序写一个简单的整数值,像这样分配的地址: WriteProcessMemory(Process, p, @MyInteger, SizeOf(Integer), BytesWritten); 由于地址是存储在p – 我可以保存地址使用它的另一个应用程序。 另一个应用程序必须再次打开外部进程来访问/写入外部进程中的地址。 现在我的问题是:在外国过程中,谁能够读写这个地址? 是否允许每个进程写入? 每个进程都允许读取吗? 只有拥有pipe理员权限的进程才有权读/写? 感谢您的回答。

检测使用C#更改的活动窗口而不进行轮询

每当当前活动窗口改变时,如何调用callback函数。 我已经看到了如何使用CBTProc完成。 但是,全局事件并不容易与托pipe代码挂钩。 我有兴趣find一种不需要轮询的方式。 我更喜欢事件驱动的方法。 问候

标准用户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。