Articles of winapi

检查一个Win32线程是否正在运行或处于挂起状态

如何检查Win32线程是否正在运行或处于挂起状态? 我找不到任何给出线程状态的Win32 API。 那么如何获得线程状态呢?

Win32代码在Windows XP / 7中获取EDID

我发现这个网页,并无法得到任何有用的信息(它searchregistry的东西,但从来没有find它,并进入一个无限循环)。 由于这个关于获取显示器串行UID(“EDID信息”)的问题,我想从Win32 C代码(或C / C ++ DDK代码,或其他)而不是Linux的angular度来看相同的信息。

我需要做些什么来使我的WH_SHELL或WH_CBT挂钩程序从其他进程接收事件?

我试图使用SetWindowsHookEx来build立一个WH_SHELL挂钩来获得系统范围的HSHELL_WINDOWCREATED和HSHELL_WINDOWDESTROYED事件的通知。 我把0传递给最后一个dwThreadId参数,根据文档 , 这个参数应该“将钩子过程与调用线程在同一桌面上运行的所有现有线程相关联”。 我也传递了我的DLL( HInstance在Delphi中)的句柄hMod参数,我所看到的所有例子。 然而,我只能得到我自己的应用程序创build的窗口的通知,而且往往会导致桌面进程一旦closures我的应用程序就会熄灭。 在你问之前,我打电话给UnhookWindowsHookEx 。 我也总是从我的处理程序中调用CallNextHookEx 。 我从一个有限的用户帐户运行我的testing应用程序,但到目前为止,我还没有发现任何暗示,这将发挥作用…(虽然这实际上令我惊讶) AFAICT,我做了所有的书(显然我没有,但到目前为止,我不知道在哪里)。 我正在使用delphi(2007年),但这应该不是真的,我想。 编辑:也许我应该提到这之前:我下载并尝试了几个例子(虽然不幸的是没有那么多的delphi – 特别是没有WH_SHELL或WH_CBT )。 虽然他们不会像我的testing应用程序那样崩溃系统,但是他们仍然不会捕获来自其他进程的事件(尽pipe我可以使用ProcessExplorervalidation它们是否可以加载到其中)。 所以看起来我的系统configuration有问题,或者这个例子错了,或者根本无法从其他进程捕获事件。 任何人都可以启发我吗? 编辑2:好的,这是我的testing项目的来源。 包含挂钩过程的DLL: library HookHelper; uses Windows; {$R *.res} type THookCallback = procedure(ACode, AWParam, ALParam: Integer); stdcall; var WndHookCallback: THookCallback; Hook: HHook; function HookProc(ACode, AWParam, ALParam: Integer): Integer; stdcall; begin Result := CallNextHookEx(Hook, ACode, AWParam, […]

从subprocess获取父进程ID

我使用CreateProcess API创build一个subprocess。 从subprocess中,我需要获取父进程ID。 如果我的进程树有一个孩子和一个大孩子。 我也需要从大孩子那里获取最顶级父母的进程ID。

在Windows中检测文件“COPY”操作

假设我希望在我的系统上启动文件副本时获得通知,并获取文件名,复制或移动的目的地以及复制时间。 这可能吗? 你将如何去呢? 你应该钩CopyFile API函数? 有没有什么软件已经完成了这个?

我如何计算GetModuleFileName的完整缓冲区大小?

GetModuleFileName()以缓冲区和缓冲区的大小作为input; 但是它的返回值只能告诉我们复制了多less个字符,如果大小不够( ERROR_INSUFFICIENT_BUFFER )。 如何确定真正需要的缓冲区大小来保存GetModuleFileName()整个文件名? 大多数人使用MAX_PATH但我记得path可以超过(260默认定义)… (使用零作为缓冲区大小的技巧不适用于此API – 我已经尝试过)

如何使用winapi更改标题栏图标

我使用Windows API创build了一个应用程序,并使用资源文件夹将图标更改为我自定义的图标。 现在程序正在桌面上使用我的图标,但是在标题栏中有默认图标,这是确切的。 现在我想如何将其更改为我的自定义图标? 我正在使用MSVC ++ WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; hwnd = CreateWindow(szAppName, TEXT("Random"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, […]

CommonScriptData中的VBScript

客户的应用程序“AppName”的configuration文件存储在CommonAppData中。 在Windows XP下是C:\Documents and Settings\All Users\Application Data\AppName 在Windows Vista中是C:\ProgramData\AppName 如何使用VBScript获得正确的文件夹名称?

在本地NTFS驱动器上查找回收站

我试图写一些简单的代码,将回收本地驱动器上回收站的目录。 看起来好像很简单 – 在Google上应该有一千个答案。 还没有find一个:( 我发现FAT和NTFS驱动器有不同的基本名称(RECYCLED和RECYCLER)。 我发现“回收站”是一个虚拟文件夹,它结合了机器上所有驱动器的回收站。 我没有find的是findC盘的回收站目录 – 即使在越南语(或任何其他非英语)的机器上。 (没有post,我可以find表明“RECYCLER”是否获得国际化) 任何人都可以指出我一个明确的答案? 谢谢 更新:意识到CSIDL_BITBUCKET和使用它的function。 从我读过的所有东西中,它指向一个虚拟目录,它是所有驱动器上该用户删除的所有文件的联合。 寻找物理回收站目录(在我的Vista上,它似乎是C:\ $ Recycle.Bin据我所知)

在Windows上以事务方式写入文件更改

关于如何确保表示特定状态的文件以一致的方式写入的官方微软build议是将其写入临时文件并replace文件。 但是如果我们假定更高级别的任务 – 更改文件中表示的状态 – 则会变得更加棘手。 要更改文件中的状态,您需要从文件中读取状态,进行更改并将其写回。 虽然我们可能会考虑使用ReplaceFile函数来覆盖“写入”部分,但是自从我们读取文件之后文件可能已经被更改的事实不是。 换句话说,在ReplaceFile调用之前,我们可能需要检查文件是否仍然相同并且没有更新。 如果我们在这里谈论文本编辑 – 在通话之前进行修改时间检查就足够了。 但是,如果我们想要一些更强大的东西 – 我们应该承认修改时间检查后,但在调用之前文件更改的可能性。 天真的做法是实现一个CompareAndReplaceFile调用,它将locking原始文件,检查它是否是同一个文件,然后复制ReplaceFile所做的。 这不仅仅是一个简单的解决scheme(系统函数的复制粘贴逻辑不是一个好的做法),也意味着更长的locking时间。 例如,在Linux上,通过使用fcntl(2)的( FD_SETLEASE )文件租用,在其他人打开文件进行写入之前有可能中止操作,在重命名(2)之前 ,是primefaces的,并不打开一个文件,所以你可以通过它保留一个租约。 有没有办法在Windows上实现事务性文件更改,除了上面讨论的一个黑客解决scheme?