Pergunta

Eu tenho várias aplicações que são parte de um conjunto de ferramentas que vários desenvolvedores no nosso estúdio. estas aplicações são principalmente aplicativos de linha de comando que abrem uma DOS Shell CMD. Estas aplicações, por sua vez iniciar uma aplicação gráfica que a produção de faixas e status (via sockets) desses aplicativos de linha de comando.

Os aplicativos de linha de comando pode ser iniciado com o usuário está logado, quando sua estação de trabalho está bloqueada (que disparar um arquivo de lote e, em seguida, imediatamente bloquear sua workstaion), e quando eles são registrados fora (via uma tarefa agendada). Os problemas que eu tenho é com os dois últimos casos.

Se algum destes aplicativos fogo off quando o usuário está bloqueado ou desconectado, estes comando vai gerar a GUI do Windows que monitora a saída / status. Isso é bom, mas dizem que o usuário tenha a sua estação de trabalho bloqueada - quando desbloquear a sua estação de trabalho, a GUI não é visível. Está funcionando a lista de tarefas, mas não é visível. A próxima vez que esses usuários executar alguns de nossos aplicativos de linha de comando, a GUI não são lançados (porque já está em execução), mas porque não é visível no ambiente de trabalho, os usuários não ver qualquer saída.

O que eu estou procurando é uma maneira de dizer a partir de meus aplicativos de linha de comando, se eles estão correndo atrás de uma estação de trabalho bloqueado ou quando um usuário estiver desconectado (via tarefa agendada) - basicamente eles estão funcionando sem desktop de um usuário visível . Se eu posso dizer isso, então eu posso simplesmente não iniciar a nossa GUI e pode evitar uma série de problemas.

Estas aplicações que eu preciso para teste são aplicações C / C ++ Windows.

Espero que isso faz sentido.

Foi útil?

Solução

Eu encontrei a resposta programática que eu estava procurando. Tem a ver com as estações. Aparentemente nada em execução no ambiente de trabalho será executado em uma estação com um nome específico. Qualquer coisa que não é na área de trabalho (ou seja, um processo iniciado pelo gerenciador de tarefas quando desconectado ou em uma estação de trabalho bloqueada) vai começar com um nome de estação diferente. Código Exemplo:

HWINSTA dHandle = GetProcessWindowStation();
if ( GetUserObjectInformation(dHandle, UOI_NAME, nameBuffer, bufferLen, &lenNeeded) ) {
    if ( stricmp(nameBuffer, "winsta0") ) {
        // when we get here, we are not running on the real desktop
        return false;
   }
}

Se você entrar na declaração 'se', então o seu processo não é na área de trabalho, mas correndo "em outro lugar". Olhei para o valor namebuffer quando não estiver em execução na área de trabalho e os nomes não significam muito, mas eles não são WinSta0.

Link para os docs aqui .

Outras dicas

Você pode ser capaz de usar SENS (serviços de notificação de eventos do sistema). Eu nunca usei-me, mas tenho quase certeza de que ele vai fazer o que quiser:. Dará notificação para eventos como logon, logoff, protetor de tela, etc

Eu sei que é muito vago, mas espero que ele irá ajudar a começar. Uma rápida pesquisa no google apareceu este, entre outros: http: //discoveringdotnet.alexeyev .org / 2008/02 / sens-events.html

Eu tenho usado com sucesso esta abordagem para detectar se o ambiente de trabalho está bloqueado no Windows:

bool isDesktopLocked = false;
HDESK inputDesktop = OpenInputDesktop(0, FALSE,
             DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |
             DESKTOP_ENUMERATE |  DESKTOP_SWITCHDESKTOP |
             DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
             DESKTOP_WRITE);

if (NULL == inputDesktop)
{
    isDesktopLocked = true;
}
else
{
    CloseDesktop(inputDesktop);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top