首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows应用程序中的RegisterHotKey

Windows应用程序中的RegisterHotKey
EN

Stack Overflow用户
提问于 2015-04-19 23:29:49
回答 1查看 559关注 0票数 2

如果我从RegisterHotKey过程调用ServiceStart (),那么ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION就会失败。我找不到很多关于这个问题的信息,所以我创建了一个线程,创建了一个窗口(CreateWindow),并从这个上下文中调用了RegisterHotKey();但是,它返回相同的错误,从服务应用程序注册热键的正确方法是什么?

代码语言:javascript
复制
    Function Makewnd(): integer;
    Var
      Hwnd: THandle;
      uMsg: TMsg;
    Begin
      Hwnd := CreateWindow('STATIC', 'DummyWindow', 0, 0, 0, 100, 100, HWND_MESSAGE, 0, HInstance, Nil);

      Writelog(pchar('CreateWindow HWND->'+inttohex(hwnd,8)));

      If (RegisterHotKey(Hwnd, 7000, MOD_CONTROL or MOD_ALT, VK_F12) = TRUE) Then
        writelog('hotkey set: MOD_CONTROL or MOD_ALT, VK_F12')
      Else begin
        Writelog(PWideChar('Error: '+inttostr(getlasterror())));
      End;

      while (GetMessage(uMsg, Hwnd, 0, 0) = TRUE) do
        case uMsg.message of
          WM_HOTKEY:
          Begin
            Writelog(PWideChar('Hotkey! ID-> ' + inttostr(uMsg.wParam)));
          End;

        end;
        Writelog('GetMessage=false');
        Result := 0;
    End;

    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      Service4.Controller(CtrlCode);
    end;

    function TService4.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;

    procedure TService4.ServiceExecute(Sender: TService);
    begin
      Writelog('ServiceExecuteing');
      while not Terminated do
      Begin
        ServiceThread.ProcessRequests(TRUE);
      End;
    end;

    procedure TService4.ServiceStart(Sender: TService; var Started: Boolean);
    Var
      TID: DWORD;
      Handle: THandle;
    begin
      writelog('ServiceStart');
      Handle := CreateThread(Nil, 0, @makewnd, Nil, 0, TID);
      //not using handle right now
    end;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-27 18:52:47

你不能

更重要的是,当Vista中引入会话0隔离时,Interactive就被淘汰了。在此之前,如果在调用SERVICE_INTERACTIVE_PROCESS ()中指定了CreateService标志,则服务可以与用户桌面交互(但只有第一个登录用户的桌面)。该标志不再受支持,服务不再能够与任何用户桌面进行交互。-雷米·莱博

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29737121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档