Window API 第五篇 WTSEnumerateProcesses

这个函数可用来枚举系统进程,先来看定义:

BOOL WTSEnumerateProcesses(
  _In_  HANDLE            hServer,
  _In_  DWORD             Reserved,
  _In_  DWORD             Version,
  _Out_ PWTS_PROCESS_INFO *ppProcessInfo,
  _Out_ DWORD             *pCount
);
参数说明:
hServer: 终端服务器的句柄,可以是调用WTSOpenServer()的返回值,或者用宏WTS_CURRENT_SERVER_HANDLE 来指定你的程序正在运行的终端服务器。到时候此参数可以为NULL,或者WTS_CURRENT_SERVER_HANDLE或者在控制台下输入nbtstat -n命令查看本地NetBIOS名称,
进一步调用WTSOpenServer(LPTSTR pServerName)函数,即可得到hServer的句柄。
这里有几个宏需要注意:
#define WTS_CURRENT_SERVER ((HANDLE)NULL)
#define WTS_CURRENT_SERVER_HANDLE ((HANDLE)NULL)
#define WTS_CURRENT_SERVER_NAME (NULL)
Reserved:保留参数,必须为0
Version:指定枚举请求的版本,必须为1
ppProcessInfo:输出参数,指向PWTS_PROCESS_INFO结构的指针, WTS_PROCESS_INFO 结构里存有进程的信息,包括name和ID
pCount:输出参数,返回枚举到的个数,即PWTS_PROCESS_INFO的数量。

返回值:成功返回非零,失败返回0。
说明:需要引入头文件:#include <WtsApi32.h> 还要导入静态库 #pragma comment (lib, "Wtsapi32.lib")
需要注意,如果调用了WTSOpenServer()函数,最后要调用WTSCloseServer()函数释放资源。但不论何时都别忘了调用WTSFreeMemory()函数释放PWTS_PROCESS_INFO指针资源。
下面举一个简单的例子


void main()
{
     PWTS_PROCESS_INFO ppi;
     DWORD dwCounts; 
     BOOL bRet = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &ppi, &dwCounts);
     if (!bRet)
         return ;
//这里先把ppi存起来,方便以后释放,当然如果用数组下标的形式访问的话就不用这样繁琐了
PWTS_PROCESS_INFO ppiTemp = ppi;
     for (int i = 0; i< dwCounts; i ++)
     {
        printf("%s \t %d \n", ppi->pProcessName, ppi->ProcessId);//ppi[i].pProcessName
        ppi ++;
      }
   //内存泄漏就是从这里来的,好多人要忘记这里
   WTSFreeMemory(ppiTemp);
  getchar();
}

 

转载于:https://www.cnblogs.com/priarieNew/p/9754113.html

#include <windows.h> #include <QString> #include <QMessageBox> int main(int argc, char *argv[]) { HANDLE mutex = ::CreateMutex(Q_NULLPTR, true, (LPCWSTR)qApp->applicationName().toStdWString().c_str()); if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox waringBox(QMessageBox::Warning, QStringLiteral("警告"), QStringLiteral("当前程序已运行,不能再次运行!")); waringBox.setButtonText(QMessageBox::Ok, QStringLiteral("确定")); waringBox.setStandardButtons(QMessageBox::Ok); waringBox.exec(); ::CloseHandle(mutex); return 0; } // 获取当前登录用户的会话ID DWORD sessionId; ProcessIdToSessionId(GetCurrentProcessId(), &sessionId); // 遍历所有用户会话,关闭其他用户会话中的该程序进程 DWORD sessionCount; if (ProcessIdToSessionId(GetCurrentProcessId(), &sessionId) && WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTS_INFO_CLASS::WTS_SESSION, (LPWSTR*)&sessionCount, &sessionId)) { WTS_SESSION_INFO* pSessionInfo = NULL; if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &sessionCount)) { for (DWORD i = 0; i < sessionCount; i++) { DWORD processCount; if (WTSEnumerateProcesses(pSessionInfo[i].hServer, pSessionInfo[i].SessionId, 1, (PWTS_PROCESS_INFO*)&processCount)) { WTS_PROCESS_INFO* pProcessInfo = NULL; if (WTSEnumerateProcesses(pSessionInfo[i].hServer, pSessionInfo[i].SessionId, 1, &pProcessInfo, &processCount)) { for (DWORD j = 0; j < processCount; j++) { if (pProcessInfo[j].SessionId != sessionId && wcsstr(pProcessInfo[j].pProcessName, qApp->applicationName().toStdWString().c_str())) { HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, pProcessInfo[j].ProcessId); if (hProcess) { ::TerminateProcess(hProcess, 0); ::CloseHandle(hProcess); } } } ::WTSFreeMemory(pProcessInfo); } } } ::WTSFreeMemory(pSessionInfo); } } // 正常执行程序 QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 上面代码会报出 error: 'WTS_CURRENT_SERVER_HANDLE' was not declared in this scope错误,请修复后给我完整代码
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值