Articles of winapi

如何在WinXP下获得精确的1ms定时器刻度

我试图每1毫秒调用一个函数。 问题是,我喜欢用windows做这个。 所以我尝试了multimediatimer API。 Multimediatimer API 资源 idTimer = timeSetEvent( 1, 0, TimerProc, 0, TIME_PERIODIC|TIME_CALLBACK_FUNCTION ); 我的结果是,大部分时间1毫秒是好的,但有时我得到了双倍的时间。 看到1.95ms左右的小颠簸multimediatimerHistogram http://img.zgserver.com/c%2B%2B/www.freeimagehosting.net 我的第一个想法是,也许我的方法运行时间太长。 但是我已经测量过了,事实并非如此。 排队计时器API 我的下一个尝试是使用queud定时器API hTimerQueue = CreateTimerQueue(); if(hTimerQueue == NULL) { printf("Error creating queue: 0x%x\n", GetLastError()); } BOOL res = CreateTimerQueueTimer( &hTimer, hTimerQueue, TimerProc, NULL, 0, 1, // 1ms WT_EXECUTEDEFAULT); 但结果并不如预期。 现在我大部分时间都是2 ms周期。 queuedTimer http://img.zgserver.com/c%2B%2B/www.freeimagehosting.net 测量 […]

运行WPF程序时防止Windows工作站(桌面)locking

问题: 我有一个WPF 全屏应用程序,它充当仪表板。 计算机处于域和域策略,强制计算机在最后一次用户活动后10分钟内被locking。 我想防止工作站(或桌面)自动locking。 这种行为的例子:Windows Media Player,在电影运行时阻止这种行为。 已知的解决scheme(有点解决方法): 有可能发送一个Win32鼠标移动事件每隔一段时间(例如,每分钟) 每隔一定的时间间隔(例如,每分钟)可以向程序发送一个键(例如“左移”键) 题: 如何防止Windows工作站locking而不使用这些解决方法? 免责声明: 我很确定,应该有一个类似的问题在StackOverflow的某个地方回答,但我没有find任何。 如果你能把我指向正确的方向,我将不胜感激。

registry拦截的替代方法

我正在寻找一种方法来截取并将读取redirect到某个registry项。 当然,Detours可以做到这一点。 但我需要一个商业应用程序和MS $ 10K许可证费太陡。 有没有其他的select?

如何在Windows中获取当前的交互式用户会话数量?

我正在编写一个Windows服务,需要知道当前是否有任何用户在机器上login。 到目前为止,我已经尝试过Win32_LogonSession (WMI)和LsaEnumerateLogonSessions / LsaGetLogonSessionData (secur32.dll)。 这两个工作,似乎都返回相同的数据,但它们太慢,无法更新时,用户注销: 系统启动时,返回“0个交互式用户”。 (好) 当我login时,他们返回“1交互式用户”。 (好) 但是,当我注销时,用户数保持为1.新login后,数为2,依此类推。 因此Win32_LogonSession和LsaEnumerateLogonSessions都不够好。 在最后一个交互式用户离开后的5分钟内,该服务需要知道。 SysInternals的LogonSessions.exe甚至没有提供最新的答案。 此外,答案不能是“监视login和注销事件,并有一个计数器variables”,因为服务可以在任何时候启动。

在重叠Win32结构hEvent成员

当使用asynchronousI / O(或Win32行话中的“重叠”I / O)时,我们需要处理OVERLAPPED结构和他的hEvent成员。 如果I / O函数会延迟读取或写入操作,我们将得到一个ERROR_IO_PENDING错误代码,然后我们将等待asynchronous操作完成一个WaitForXxxEvent函数,然后调用GetOverlappedResult 。 但是,如果I / O操作立即完成,我们将不会获得ERROR_IO_PENDING ,并且在读取操作中,我们的读取缓冲区将立即被填充。 但是OVERLAPPED::hEvent成员呢? 它会被设置为信号状态? 我还没有find明确的说法。 这个问题似乎毫无意义(为什么处理事件,如果我知道该操作已经完成?),但是我有一个模仿重叠模式库,我需要有相同的确切行为。 正如edgar.holleis在他的评论中所指出的, Raymond Chen在他的博客中解释了这一点: http : //blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx 如果一个asynchronousI / O同步完成,那么OVERLAPPED结构中的hEvent是否仍然有信号? 是。 当I / O完成时(无论是同步的还是asynchronous的),事件被发信号并且完成状态通知被排队。 GetOverlappedResult/Ex函数可用于等待已完成的I / O; 它只会立即返回。 如果你询问HasOverlappedIoCompleted I / O是否已经完成,并且I / O同步完成,它会正确地报告“是的,当然它已经完成了,哎呀,很久以前就完成了! 换句话说,您可以在逻辑上将asynchronousI / O请求的情况同步完成,就像它asynchronous完成一样。 它只是在你眨眼之前asynchronous完成。

在Windows上,控制台窗口所有权如何工作?

从另一个控制台应用程序启动控制台应用程序时,控制台所有权如何工作? 我看到了四种可能性: 第二个应用程序从第一个应用程序的一生中inheritance控制台,并在退出时将控制台返回给原始所有者。 每个应用程序都有自己的控制台 然后,Windows以某种方式将两者的内容合并到用户可见的“控制台”中 第二个应用程序获取属于第一个应用程序的控制台的句柄。 控制台放置在共享内存中,两个应用程序拥有相同的“所有权” 我很可能错过了一些东西,而这四个选项都没有充分描述Windows在其控制台上的作用。 如果答案接近选项4.我的后续问题是两个进程中的哪一个负责pipe理窗口? (当屏幕需要刷新/重绘等处理graphics更新) 一个具体的例子:运行CMD。 然后,使用CMD,运行[控制台应用程序]。 [控制台应用程序]将写入似乎与CMD使用的控制台窗口相同的窗口。

检测外部进程是否交互式,并有任何可见的用户界面

我似乎无法find一种方法来确定一个Process是否有一个用户界面,例如一个窗口,这是用户可见的? Environment.UserInteractive对外部进程没有用处 process.MainWindowHandle != IntPtr.Zero似乎总是在我的testing中返回false? 我想区分说Notepad和conhost

将std :: string转换为const BYTE *(对于RegSetValueEx()

我有一个函数,得到一个std ::string。 该函数调用 函数RegSetValueEx 第五个参数是registry值的值,并且需要const BYTE *types的variables。 所以我必须将std :: string转换为const BYTE *,并将结果数组的长度作为第6个参数。 我已经find了一个方法来做到这一点,但它感觉很难看,我真的不明白是怎么回事。 这是一个减肥版本的function: void function(const std::string& newValue) { HKEY keyHandle; if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS) { std::wstring wNewValue; wNewValue.assign(newValue.begin(),newValue.end()); if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS) { //do something } RegCloseKey(keyHandle); } } 正如你所看到的,我首先做一个宽string(UNICODE被定义),然后使用双重强制转换,并且长度必须做* 2,否则它只会设置inputstring的一半。 这种forms是否正常/最好的方式来做到这一点? 为什么* 2,有什么更好的办法?

FindFirstFile / FindNextFilerecursionsearch没有find“程序文件”

我已经用C编写了一个应用程序,它使用FindFirstFile / FindNextFile Windows APIrecursionsearch从C:开始的目录。 它成功地遍历文件系统并查找和search所有子目录,但无法search“Program Files”目录。 有没有我在这里失踪的权限问题? 我应该注意到正在运行的应用程序在SYSTEM帐户的上下文中,该帐户是具有访问“程序文件”权限的帐户。 有没有人经历过这个? 我已经完成了很多关于这个问题的答案,但到目前为止还没有发现这种行为的确定性原因。 这里是我用来search目录的代码: static void SearchDirectory(PCHAR pszDirectory) { CHAR szSearch[MAX_PATH] = {0}; CHAR szDirectory[MAX_PATH] = {0}; HANDLE hFind = NULL; WIN32_FIND_DATAA FindFileData; sprintf_s(szSearch, MAX_PATH, "%s%s", pszDirectory, "*"); hFind = FindFirstFileA(szSearch, &FindFileData); if(hFind == INVALID_HANDLE_VALUE) return; do { // Do file processing here etc if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY […]

如何使用选定的文件显示资源pipe理器?

什么是API调用显示一个指定的文件select的资源pipe理器窗口? 就像在单击.lnk快捷方式的“属性”对话框中的“查找目标…”button时发生的情况一样? 我知道有一个函数(或一个接口方法),但我忘了名字,并且找不到它。 请注意,我知道的explorer /select,<pathname>命令行,而不是使用它,而不是API调用感兴趣。