草庐IT

c - 句柄到窗口句柄

我试过使用“获取桌面枚举的所有进程ID”方法,但是这不起作用。有没有办法将句柄转换为窗口句柄?-或者-有没有办法获取进程ID并找出该进程生成的所有子窗口?由于多个进程问题,我不想使用FindWindow。 最佳答案 您可以调用EnumWindows()遍历屏幕上的所有顶级窗口,然后使用GetWindowThreadProcessId()找出哪些属于您的流程。例如,像这样的东西:BOOLCALLBACKForEachTopLevelWindow(HWNDhwnd,LPARAMlp){DWORDprocessId;GetWindowTh

windows - 为什么打开的 DLL 句柄不能保护文件不被移动?

我刚刚遇到一个令人惊讶的错误,其中一个DLL文件是使用LoadLibrary加载的API调用在加载时被重命名。显然,在文件上有一个打开的DLL句柄并不会阻止该文件被重命名,甚至不会被移动到不同的路径。但是,它受到保护,不会被删除和移动到不同的磁盘。如果发生这种情况,使用DLL的程序继续正常工作。ProcessExplorer显示DLL句柄的路径相应更新。此行为不同于Windows中的普通文件句柄。例如,当保持一个打开的std::ifstream到同一个DLL时,操作系统不再允许重命名。我发现这种行为非常令人惊讶,想知道是否有人可以对此做出解释?特别是我对允许这样做的理由很感兴趣,因为我

windows - 如何追踪句柄泄漏?

在我的一个应用程序中,我观察到越来越多的句柄。在不使用应用程序的情况下,该数字大约每秒递增一次,因此后台处理代码的某些部分肯定存在句柄泄漏。如何追踪此类泄漏?有什么工具可以帮助解决这个问题吗?跟踪句柄泄漏时要寻找哪些模式?导致句柄泄漏的最常见错误是什么?一堆问题,但我希望它们足够相关,可以将它们放在一个问题中。感谢您提前输入! 最佳答案 我建议使用ProcessExplorer.以管理员身份运行它以确保您看到所有相关数据。在那里你可以观察你的进程有什么样的句柄,哪些句柄被过度创建并且没有被释放。这应该可以帮助您缩小搜索范围(在我的例

c# - 获取桌面/外壳窗口的句柄

在我的一个程序中,我需要测试用户当前是否聚焦于桌面/shell窗口。目前我正在使用user32.dll中的GetShellWindow()并将结果与​​GetForegroundWindow()进行比较。这种方法在有人更改桌面墙纸之前一直有效,但是一旦更改了墙纸,GetShellWindow()的句柄就不再与GetForegroundWindow()的句柄匹配,我不太明白为什么会这样。(操作系统:Windows732位)是否有更好的方法来检查桌面是否聚焦?如果用户更改壁纸,最好是不会损坏的?编辑:我设计了一个解决方法:我正在测试句柄是否有类“SHELLDLL_DefView”的子项。如

windows - 如何将进程的 stdout 和 stderr 通过管道传输到同一个句柄?

如何将进程的标准输出和标准错误通过管道传输到同一个句柄?在unix系统上,这非常简单,只需使用createPipe并将写入端作为stdout和stderr传递给runProcess。在Windows上更难:unix-compat和Win32包都没有导出创建管道的方法。openTempFile(可用于模拟管道)在创建的Handle上设置了错误的模式。编辑:为了提供更多上下文:我想运行一个进程,并让它以跨平台的方式将其标准输出和标准错误写入相同的Handle。 最佳答案 您可以使用来自System.Process的东西.在CreateP

Windows - 无法强制关闭网络文件句柄 - 无法关闭系统 (Pid 4) 文件句柄

首先,很抱歉问了这么长的问题,但我想提供足够的细节。概要:在Windows中,似乎无法强制关闭通过网络共享打开的文件句柄。因此,无法移动/重命名/删除通过网络共享打开的文件。我正在使用Win7。问题:任何人都可以看到我做错了什么,或者有人可以确认这是预期的并且不可能强制关闭系统文件句柄(总是在pid4上,例如与文件的网络共享访问相关的那些句柄)。背景:我们有访问日志文件的远程网络客户端用户。我们需要滚动日志文件,以免它变得太大。我们无法滚动日志文件,因为该文件被报告为正在使用中。重现问题:0)以管理员身份执行所有操作1)创建一个新目录并分享2)在新目录下创建文件3)通过文件共享,使用M

windows - 窗口句柄 (HWND) 是唯一的,还是它们曾经被重复使用?

我在想是否有相同值的句柄?为了澄清我的问题,假设我打开记事本,输入一些文本,保存,然后关闭记事本。如果我重复此操作一千次(或更多次),我是否有机会看到第一次使用的记事本主窗口使用相同的窗口句柄(HWND)值?如果是,为什么? 最佳答案 是的。句柄只能表示有限数量的值,因此Windows最终必须重用它们。句柄一旦关闭,它就消失了,你不能用它做任何事情,它不存在,你甚至不应该看它。如果您随后打开另一个句柄,则Windows可能会重用该句柄值。 关于windows-窗口句柄(HWND)是唯一的

windows - 如何在拥有句柄时检查给定进程是否正在运行

我正在使用ShellExecuteEx启动应用程序。成功启动后,我会读取TShellExecuteInfo.hProcess以获取已启动进程的句柄。我想定期检查我的应用程序启动的进程是否仍在运行。两个或多个同名进程可以同时运行,我想确保我的应用程序正在检查正确的进程。我希望能够在Windows2000及更高版本的Windows系统上执行此操作。我知道WinAPI函数GetProcessId正在做我想做的事情,但它不支持Windows2000。感谢您的回答。 最佳答案 调用WaitForSingleObject在该句柄上,并使用零超时

c - 从 I/O 完成端口中删除句柄以及有关 IOCP 的其他问题

CreateIoCompletionPort函数允许创建新的I/O完成端口并将文件句柄注册到现有的I/O完成端口。然后,我可以使用任何函数,例如套接字上的recv或具有OVERLAPPED结构的文件上的ReadFile来启动一个异步操作。我必须检查函数调用是否同步返回,尽管它是用OVERLAPPED结构调用的,在这种情况下直接处理它。在另一种情况下,当返回ERROR_IO_PENDING时,我可以使用GetQueuedCompletionStatus操作完成时得到通知的函数。出现的问题是:如何从I/O完成端口删除句柄?例如,当我向IOCP添加套接字时,如何删除已关闭的套接字?我是否应该

windows - powershell 2.0重定向文件句柄异常

我正在寻找解决操作系统句柄的位置不是FileStream所期望的。不要在一个FileStream和Win32代码或另一个FileStream中同时使用句柄。异常也适用于包含"thefix"的脚本中调用的脚本。.为了这个问题的目的,假设我有两个脚本:foo.ps1#$bindingFlags=[Reflection.BindingFlags]"Instance,NonPublic,GetField"$objectRef=$host.GetType().GetField("externalHostRef",$bindingFlags).GetValue($host)$bindingFlag