GetLastInputInfo зависит от пользователя - есть ли что-то похожее, что дает в последний раз машинный ввод
Согласно MSDN, http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx
GetLastInputInfo не предоставляет общесистемную информацию о пользователях во всех запущенных сеансах. Скорее GetLastInputInfo предоставляет специфичную для сеанса информацию пользовательского ввода только для сеанса, который вызвал функцию.
Есть ли что-то подобное, что обеспечивает общесистемную информацию о последнем пользовательском вводе?
2 ответа
Я считаю, что единственный способ сделать это - подключиться к оболочке.
Это (очевидно) что-то, что должно быть сделано осторожно, и что-то неосуществимое в управляемом коде, пока это не будет полностью поддержано операционной системой (не до Windows 7), поэтому вам придется использовать некоторый неуправляемый код для достижения этого, возможно, обновить некоторые глобальное состояние, запрашиваемое из вашего управляемого кода. API для этого - SetWindowsHookEx.
С изоляцией сеансов в Vista и далее вам потребуются повышенные привилегии, чтобы сделать это для других сеансов. В этом могут помочь подсказки о том, как работают клавиатурные шпионы, но у меня нет готовой ссылки на какой-либо источник для этого.
В качестве первого начала приведу исходный код Windows-порта кондора для определения активности клавиатуры:
/***************************************************************
*
* 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;
}
Недавно я немного поработал. Несколько пользователей могут использоватьWTSServer
получить ихWTSInfo
Он включает в себя много информации о пользователях, и я надеюсь, что он может вам помочь.
typedef struct _WTSINFOA {
WTS_CONNECTSTATE_CLASS State;
DWORD SessionId;
DWORD IncomingBytes;
DWORD OutgoingBytes;
DWORD IncomingFrames;
DWORD OutgoingFrames;
DWORD IncomingCompressedBytes;
DWORD OutgoingCompressedBy;
CHAR WinStationName[WINSTATIONNAME_LENGTH];
CHAR Domain[DOMAIN_LENGTH];
CHAR UserName[USERNAME_LENGTH + 1];
LARGE_INTEGER ConnectTime;
LARGE_INTEGER DisconnectTime;
LARGE_INTEGER LastInputTime;
LARGE_INTEGER LogonTime;
LARGE_INTEGER CurrentTime;
} WTSINFOA, *PWTSINFOA;