为什么从服务调用时 GetWindowThreadProcessId 返回 0?

2023-12-08

在控制台应用程序中使用以下类,并且至少有一个记事本实例正在运行时,GetWindowThreadProcessId正确返回非零线程 ID。但是,如果 Windows 服务中包含相同的代码,GetWindowThreadProcessId总是返回0并且不会抛出任何异常。将服务启动的用户更改为与运行控制台应用程序的用户相同并不会改变结果。是什么原因导致GetWindowThreadProcessId回来0即使它提供了有效的 hwnd?为什么它在控制台应用程序和服务中的功能不同?注意:我运行的是 Windows 7 32 位并面向 .NET 3.5。

public class TestClass
{
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

    public void AttachToNotepad()
    {
        var processesToAttachTo = Process.GetProcessesByName("Notepad")

        foreach (var process in processesToAttachTo)
        {
            var threadID = GetWindowThreadProcessId(process.MainWindowHandle, 
                IntPtr.Zero);

            ....
        }
    }
}

控制台代码:

class Program
{
    static void Main(string[] args)
    {
        var testClass = new TestClass();

        testClass.AttachToNotepad();
    }
}

服务代码:

public class TestService : ServiceBase
{
    private TestClass testClass = new TestClass();

    static void Main()
    {
        ServiceBase.Run(new TestService());
    }

    protected override void OnStart(string[] args)
    {
        testClass.AttachToNotepad();

        base.OnStart(args);
    }

    protected override void OnStop()
    {
        ...
    }
}

服务在其自己的会话中运行,即 Vista 和 Win7 中臭名昭著的会话 0。该会话将服务与用户桌面隔离,它在另一个会话中运行。特别是为了防止通常使用非常特权的帐户(例如 LocalSystem)运行的服务与用户交互。一个安全漏洞。

因此,服务无法看到另一个会话拥有的窗口句柄。

不确定为什么要这样做,但您通常需要一个帮助程序来呈现用户界面并通过 IPC 机制(如命名管道、套接字、.NET 远程处理或 WCF)与服务进行通信。如果使用命名管道,请在管道名称前添加前缀"Global\"所以所有会话都可以看到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么从服务调用时 GetWindowThreadProcessId 返回 0? 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何使用 php 从 HTML 表单收集数据?

    假设有一个 HTML 文件 其中有一个表单 其中包含一些数据 这些数据是使用 textarea 和 checkbox 从用户那里获取的输入 如何将此数据发送到 PHP 文件 您可以通过提交表单来发布此数据 然后在您可以使用的 php 文件上
  • 基于iOS 4并部署iOS 3的媒体播放器问题

    当在设备 3 1 2 上运行时 为什么它还传递 if NSClassFromString MPMoviePlayerViewController nil 做iOS4的代码就会崩溃 如何解决这个问题 if NSClassFromString
  • 使用 C# 将 FileStream 编码为 base64

    我知道如何对一个简单的字符串进行编码 解码base64 但是如果数据已经被写入文件流目的 假设我只能访问 FileStream 对象 而不能访问其中先前存储的原始数据 我将如何编码文件流转base64在将 FileStream 刷新到文件之
  • 具有重复数字的序列[重复]

    这个问题在这里已经有答案了 Data 我有一个data frame看起来像这样 df lt data frame id c 1 10 color c rep red 5 rep blue 5 df gt id color gt 1 1 re
  • 使用 django 查询返回活动时区中的日期时间

    我试图从表中检索最后 n 小时的行并在给定时区中打印它们的日期时间 给出打印日期时使用的时区 我试图使用 activate 使 django 返回具有正确时区的日期时间 但它返回 UTC 格式的日期 这是我当前的代码 min time da
  • Android 中如何实现通知功能?

    我正在 Android 上做一个帮助台应用程序 我想实现未读票证的通知 客户建议或投诉 在此应用程序的 iPhone 版本中 即使该应用程序未在应用程序图标本身上打开未读票据计数器 在 Android 中是否有可能 如果是这样 请帮助我像
  • QDate - 错误的年份

    我有以下情况 QDate fixDate QDate fromString QString 270912 ddMMyy 返回的年份是1912 我不明白为什么以及如何获得正确的年份 提前致谢 两位数年份始终解释为19xx 所以你可以通过YYY
  • Android并发数据库操作——“数据库被锁定”

    我正在编写一个具有 在线模式 的应用程序 即根据需要下载 解析数据并将其插入到 SQLite 数据库中 所有这些都是由服务执行的 该应用程序由多个请求服务更新数据的活动组成 不同的数据取决于活动 当用户浏览活动时 无需等待服务完成 很容易获
  • 比 MySQL 中的 UUID 更短的非重复字母数字代码

    当我插入一条记录时 MySQL数据库是否可以生成仅由数字和字母组成的5或6位数字代码 如果是这样怎么办 就像 goo gl bit ly 和 jsfiddle 一样 例如 http bit ly 3PKQcJ http jsfiddle n
  • Cakephp 和对多个结果集进行分页

    当在一个操作中调用一次 this gt paginate 时 我的分页工作正常 但它似乎不能很好地支持多次调用 这就是我想做的 function admin index published this gt pagination Post a
  • 核心动画围绕点旋转

    我想让 IBOutlet 围绕父视图中的特定点旋转 目前我只知道如何围绕锚点旋转它 但是 我想使用对象图层之外的点 旋转角度是相对于设备从该点出发的方向计算的 void viewDidLoad super viewDidLoad locat
  • 合并两个单独的 MySQL 查询的结果

    我正在尝试执行两个单独的数据库查询并将结果返回到表单 每个结果都写入一个表中 我希望能够将两个查询合并为一个查询 并按任务编号对结果进行排序 第一个查询 Booking Date date d m Y driver SESSION user
  • “从未使用过不可变值‘context’的初始化,请考虑替换对‘_’的赋值或将其删除

    我很快将变量声明为 let context LAContext LAContext 它会发出警告 从未使用过不可变值 context 的初始化 请考虑替换对 的赋值或将其删除 一切都在错误消息中 值 从未使用过 您的变量没有在任何地方使用
  • 将 Quartz 连接到 MS Sql Server

    我对 Quartz Job Scheduler 相当陌生 我可能会问一些愚蠢的问题 但是 我在将 Quartz Server 2010 连接到 MS SQL Server 2012 时遇到问题 我创建了几个工作正常的作业 但无法创建与 SQ
  • 字符串中当前位置左侧的字符位置

    从字符串中的某个任意位置 我需要找到距离我的位置左侧最近的字符位置 如果我想向右执行此操作 我可以使用 IndexOf 但我不确定如何向左做 我想出的两种方法只是从我的位置开始的递减循环 或者将字符串反向并使用正常的 IndexOf 其他人
  • 列表视图适配器中的按钮

    任何人都可以解决我的问题 经过 2 天的努力 我终于得到了 70 的输出 Exp 我有列表视图 其数据来自服务器 列表视图内部有一些文本 按钮和滚动索引 A BC D E F G 问题 按钮不起作用意味着当我单击它时 如果添加以下代码 它看
  • 转编译为另一种语言[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 代码转编译的典型方式有哪些 目前 我正在编写一种简单的编程语言 其处理方式是递归的 循环遍历一个节点列表 假设当前节点是一个变量节点 它会调用一个emit variable no
  • .NET UIElement.TranslatePoint 的 UWP 等效项

    我希望获取 UIElement 相对于其容器的位置 以将图像覆盖在其顶部 System WIndows 命名空间中的 UIElement 正是我想要的 UWP 中的等效项是什么 您可以使用UIElement TransformToVisua
  • 如何更改线性布局与相对布局中文本视图和按钮的顺序?

    我对 stackoverflow 完全陌生 对 Android 移动开发也只有几周的时间 非常感谢 stackoverflow 我 90 的以 Android eclipse 开头的 google 搜索都是在这里找到的 现在开始追逐 我有一
  • 为什么从服务调用时 GetWindowThreadProcessId 返回 0?

    在控制台应用程序中使用以下类 并且至少有一个记事本实例正在运行时 GetWindowThreadProcessId正确返回非零线程 ID 但是 如果 Windows 服务中包含相同的代码 GetWindowThreadProcessId总是