【问题标题】:Create Windows Service and capture touch events Win7 c#创建 Windows 服务并捕获触摸事件 Win7 c#
【发布时间】:2011-07-20 23:50:01
【问题描述】:

我想帮助我创建一个 Windows 服务,该服务可以侦听多点触控事件的发生,拦截它们,然后对它们做一些事情(不重要)。 我还需要知道如何将 Windows 消息发送到此服务以及能够从服务内接收这些消息的代码。

请问大家有什么想法吗?

我已经编写代码 15 年了,但之前从未编写过 Windows 服务,我需要一些帮助才能继续我的工作:(

【问题讨论】:

  • 绝对没有理由让您将其编写为 Windows 服务。像这些年来一直在做的那样编写一个标准的用户模式应用程序。服务不仅仅是一直在后台运行的用户模式应用程序。如果需要,只需创建一个在后台运行的应用即可。
  • 感谢您的回复。请您解释一下我猜想运行 window/form-less 的应用程序是如何接收 Windows 消息的?
  • 啊,也许我终于明白你的问题了。 听起来,您需要的是 message-only window。您可以在标准应用程序(而不是服务)中创建它,您仍然可以发送/接收消息,但屏幕上永远不会显示实际的窗口。它只会在后台运行。
  • 谢谢科迪。这是这种情况。我们已经有一个应用程序(EXE),我们只是说为了参数我们不能更改代码,但我们可以告诉它在用户执行某些操作时向特定的窗口/应用程序发送 Windows 消息(WM)。假设用户滑动滑块来改变音量...我需要一个应用程序或任何隐藏在后台运行的东西来监听这些消息,然后与 Windows API 交互来改变音量。我已经在我编写的 DLL 中获得了所有代码,我只需要真正知道如何编写一个应用程序来接收这些消息.........
  • .....(以及如何发送会很方便)。我查看了 WndProc(ref Message m) ,我认为这是后台应用程序所需要的,但我似乎无法让它工作。您是否已经知道 'tineternet 上的任何类似示例,或者您能帮忙提供一个吗?

标签: c# visual-studio-2010 windows-services multi-touch


【解决方案1】:

根据定义,Windows 服务不应该是用户交互的,因此,如果您想获取多点触控数据,您必须使用WM_TOUCH windows 挂钩直接挂钩到操作系统输入消息中,并且自己解释这些数据。

【讨论】:

  • 谢谢你。所以说我创建了这个钩子,它可以很好地捕获触摸事件。我如何 - 例如将此 Windows 服务设置为能够从其他应用程序接收 Windows 消息?例如,假设我的 WS 具有更改 Windows 亮度的功能,并且该功能是 SetBrightness(int brightLevel) 我必须将哪些代码/功能添加到我的 Windows 服务中才能处理?
  • 这个答案的第一句话是正确的。其余的都是废话。如果删除,这将值得一票。服务不是交互式的;结束。
  • @Cody 如果您在上面看到我的评论,请您解释一下我如何通过 Windows 服务或其他接受 Windows 消息的方式实现这一目标?
  • @Kevin:服务和应用程序都不能接收到其他应用程序的通知。您唯一的选择是安装全局系统挂钩,这是一种非常繁重的方法,可能不推荐使用。如果您想收到通知并做出相应反应,其他应用程序必须将其私人消息转发到您的应用程序。如果你想创建一个基于触摸输入改变亮度的应用程序,那么你需要编写一个用户可以与之交互的常规应用程序,指定一个改变亮度的模式,并编写代码来实现它...
  • 你选择调用函数。没有理由将其作为 Windows 服务执行,事实上,如前所述,它永远不会作为服务正常工作,因为服务旨在与用户交互或接收用户输入。他们曾经可以的事实是 Vista 最终修补的安全漏洞。我还是不明白你为什么认为你需要写一个 Windows 服务。
【解决方案2】:

对于那些感兴趣的人,我决定走普通 Windows 窗体应用程序的路线,当它上线时,for 将是不可见的,因此当我需要其他应用程序时,它将在“后台”运行与starts沟通。

我设法让 WndProc(ref Message m) 正常工作,并且我的应用程序正在接收消息,并根据发送的说明执行它需要执行的操作。

例如,可见应用程序有一个用于音量控制的 GUI 滑块。当滑块移动时,该滑块的值会通过 Windows 消息发送到我的“后台”应用程序,并且“后台”应用程序会更改设备/PC 的音量级别以及何时请求音量级别, 一条回传消息被发送到请求的应用程序,告诉它当前设置的音量级别。

下面的一些示例代码:-

public const int UI_VOLUME_SET = 1101;
    public const int UI_VOLUME_GET = 1100;
    public const int UI_VOLUME_SET_MUTE_STATUS = 1102;

    public const int UI_BRIGHT_GET = 1201;
    public const int UI_BRIGHT_SET = 1202;

    public const int UI_TERMINATE = 9999;

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]Protected override void WndProc(ref Message m)
    {
        int _exoUI = MessageHelper.FindWindow(null, "MY UI");
        EXOxtenderLibrary.VolumeControl _vol;
        switch (m.Msg)
        {
            case UI_TERMINATE:
                this.Close();
                break;
            case UI_BRIGHT_GET:
                //ADD CODE HERE
                break;

            //case UI_BRIGHT_SET:
            //    //ADD CODE HERE
            //    break;

            case UI_VOLUME_GET:
                _vol = new EXOxtenderLibrary.VolumeControl();
                MessageHelper.PostMessage(_exoUI, 32773, _vol.GetVolume(), _vol.isMute);
                _vol = null;
                break;

            case UI_VOLUME_SET:
                _vol = new EXOxtenderLibrary.VolumeControl();
                _vol.SetVolume(m.WParam.ToInt32());
                MessageHelper.PostMessage(_exoUI, 32773, _vol.GetVolume(), _vol.isMute);
                _vol = null;
                break;

            case UI_VOLUME_SET_MUTE_STATUS:
                _vol = new EXOxtenderLibrary.VolumeControl();
                if (m.WParam == new IntPtr(1))
                { _vol.Mute = true; }
                else
                { _vol.Mute = false; }
                MessageHelper.PostMessage(_exoUI, 32773, _vol.GetVolume(), _vol.isMute);
                _vol = null;
                break;
        }

        base.WndProc(ref m);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多