关注应用程序 - 与操作系统相关的问题

本文关键字:问题 操作系统 应用程序 | 更新日期: 2023-09-27 18:26:46

我正在编写一个 .NET 4.0 应用程序,它只是接受输入到 TextBox 中,对其进行处理,然后将其发送到数据库。此应用程序旨在与USB条形码扫描仪一起使用。

我需要确保这些条形码扫描的输入由此应用程序处理。我被要求确保此应用程序始终保持激活和专注,因为它将驻留的笔记本电脑除了电源和接受来自 USB 条形码扫描仪的输入外没有其他要求。

我通过使用按设定间隔或更好的间隔调用this.Activate()System.Windows.Forms.Timer设法自己实现了这一目标;

    protected override void OnDeactivate(EventArgs e)
    {
        BeginInvoke((Action)this.Activate);
        base.OnDeactivate(e);
    }

虽然这些方法在我的Windows 8.1开发计算机上工作正常,但我无法让相同的代码在Windows 7操作系统上运行(我已经尝试了许多盒子和VM(。对于 Win7 机器,我可以看到此代码执行正常,但我无法让我的应用程序再次激活。

任何人都可以告诉我为什么我会看到这种行为吗?非常感谢!

关注应用程序 - 与操作系统相关的问题

Windows 仅允许拥有前台窗口的应用程序将另一个窗口引入前台(其自身的窗口或属于另一个应用程序(。后台应用程序无法将自身置于前台。这是一个深思熟虑的设计选择(我记得大约在Windows 98中引入(,以防止后台应用程序中断用户正在执行的操作 - 特别是为了确保键盘输入转到正确的位置,并且不会意外触发用户不想要的操作。

此约束记录在SetForegroundWindow文档中:

系统限制哪些进程可以设置前台窗口。仅当满足以下条件之一时,进程才能设置前台窗口:

• 过程是前台过程。

• 该进程由前台进程启动。

• 进程收到最后一个输入事件。

• 没有前台进程。

• 正在调试进程。

• 前台进程不是新式应用程序或"开始"屏幕。

• 前台未锁定(请参见 LockSetForegroundWindow(。

• 前台锁定超时已过期(请参阅系统参数信息中的SPI_GETFOREGROUNDLOCKTIMEOUT(。

• 没有菜单处于活动状态。

来源:SetForegroundWindow 函数 (Windows(

如果需要确保来自条形码扫描仪的输入进入特定应用程序,则应查看键盘挂钩、扫描仪是否配置为键盘仿真,或者扫描仪是否支持另一个 API 以允许直接控制。

例如,扫描仪可能支持全国零售联合会的统一POS标准。Microsoft提供了一个库,即 POS for .NET,它允许从 .NET 控制 UnifiedPOS 设备。

这是非法行为。您正在窃取用户的控制权,这在桌面生态系统中是被禁止的。用户应始终是控制者。Windows Vista+开始更加关注这样的事情。

操作系统应该做的正确的事情是通知用户您希望他的注意(例如,闪烁任务栏中的窗口(,它不能实际激活您的窗口。每次操作系统允许您从用户那里窃取控制权时,它都被认为是一个错误,通常必须修复。

也许你想替换默认的Windows外壳?这将允许您简单地运行一个应用程序,当它关闭时,它将重新启动机器......

条形码扫描仪通常传输其数据,就像某些用户使用键盘键入数据一样。这导致了一个错误的假设,即您需要始终保持焦点和活动窗口。

但是,您可以使用石器时代的技术,称为键盘记录(通常在前面带有">特洛伊木马"一词(。这是通过在基于窗口的系统中设置键盘挂钩来实现的。然后,您的应用程序可以拥有所有输入。

它是通过使用SetWindowsHookEx来完成的。我仍然有使用钩子的Windows XP软件,它似乎可以在Window 8下工作。

确定何时是条形码扫描仪以及用户何时在另一个应用程序的登录表单中输入密码的问题,我任您使用=P。