GetLastInputInfo зависит от пользователя - есть ли что-то подобное, которое дает время последнего ввода для всей машины

Согласно MSDN, http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx

GetLastInputInfo не предоставляет общесистемную информацию о пользовательском вводе для всех запущенных сеансов. Вместо этого GetLastInputInfo предоставляет информацию о пользовательском вводе, относящуюся к сеансу, только для сеанса, вызвавшего функцию.

Есть ли что-то подобное, которое предоставляет общесистемную информацию о последнем вводе пользователя?


person Community    schedule 02.08.2009    source источник


Ответы (1)


Я считаю, что единственный способ сделать это — подключиться к оболочке.

Это (очевидно) то, что нужно делать осторожно, и это невозможно в управляемом коде, пока это не будет полностью поддерживаться операционной системой (не до Windows 7), поэтому вам придется использовать неуправляемый код для достижения этого, возможно, обновив некоторые глобальное состояние, запрашиваемое из вашего управляемого кода. API для этого — SetWindowsHookEx.

С изоляцией сеанса Vista и далее вам потребуются повышенные привилегии, чтобы сделать это для других сеансов. В этом может помочь использование подсказок о том, как работают кейлоггеры, но у меня нет готовой ссылки на какой-либо источник для этого.

В качестве первого запуска здесь приведен источник из порта Windows condor для определения активности клавиатуры:

/***************************************************************
 *
 * Copyright (C) 1990-2007, Condor Team, Computer Sciences Department,
 * University of Wisconsin-Madison, WI.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you
 * may not use this file except in compliance with the License.  You may
 * obtain a copy of the License at
 * 
 *    http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ***************************************************************/


#include <windows.h>

// Shared DATA
// put in here data that is needed globally
#pragma data_seg(".SHARDATA")
HHOOK hHook = NULL;
LONG KBkeyhitflag = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SHARDATA,RWS")

__declspec(dllexport) LRESULT CALLBACK KBHook(int nCode, WPARAM wParam,
LPARAM lParam)
{
    InterlockedExchange(&KBkeyhitflag,1);

    return CallNextHookEx(hHook,nCode,wParam,lParam);
}

HINSTANCE g_hinstDLL = NULL;

#if defined(__cplusplus)
extern "C" {
#endif //__cplusplus


int __declspec( dllexport) WINAPI KBInitialize(void)
{
    hHook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KBHook,g_hinstDLL,0);
    return hHook ? 1 : 0;
}

int __declspec( dllexport) WINAPI KBShutdown(void)
{
    if ( UnhookWindowsHookEx(hHook) )
        return 1;   // success
    else
        return 0;   // failure
}

int __declspec( dllexport)  WINAPI KBQuery(void)
{
    if ( InterlockedExchange(&KBkeyhitflag,0) )
        return 1;   // a key has been hit since last query
    else
        return 0;   // no keys hit since asked last
}

#if defined(__cplusplus)
} // extern "C"
#endif //defined(__cplusplus)

BOOL WINAPI DllMain(HANDLE hInstDLL, ULONG fdwReason, LPVOID lpReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            g_hinstDLL = (HINSTANCE)hInstDLL;
            DisableThreadLibraryCalls(g_hinstDLL);
            break;
    }
    return 1;
}
person Community    schedule 02.08.2009