利用WTSEnumerateProcesses枚举进程

const
  wtsapi='Wtsapi32.dll';
 WTS_CURRENT_SERVER_HANDLE=0;

//定义数据结构
type

 _WTS_PROCESS_INFO =record    //进程信息
  SessionId:DWORD ;
  ProcessId:DWORD ;
  pProcessName:LPTSTR ;
  pUserSid:PSID;
end;
 WTS_PROCESS_INFO=_WTS_PROCESS_INFO;
 PWTS_PROCESS_INFO=^WTS_PROCESS_INFO;

 

type                        //定义 WTSEnumerateProcesses函数
 TWTSEnumerateProcesses=function(
  hServer:THANDLE ;
  Reserved:DWORD;
  Version:DWORD;
  ppProcessInfo:PWTS_PROCESS_INFO;
  pCount:PDWORD):bool;stdcall;
 
 TWTSFreeMemory=procedure(pMemory:Pointer);stdcall;

var
  HWtsApi:Thandle;
  WTSEnumerateProcesses:TWTSEnumerateProcesses;
  WTSFreeMemory:TWTSFreeMemory;
  pProcessInfo,cProcessInfo:PWTS_PROCESS_INFO ;
  ProcessCount:dword;
  i:integer;

function LoadWtsApi: LongBool;  //动态加载WTSEnumerateProcessesA和WTSFreeMemory
begin
  if HWtsApi = 0 then
  begin
    HWtsApi := LoadLibrary(WtsApi);
    if HWtsApi<> 0 then
    begin
      WTSEnumerateProcesses:= GetProcAddress(HWtsApi, 'WTSEnumerateProcessesA');
      WTSFreeMemory        := GetProcAddress(HWtsApi, 'WTSFreeMemory');
    end;
  end;
  Result := Assigned(WTSEnumerateProcesses) and Assigned(WTSFreeMemory);
end;

 

procedure showPL;
begin

 LoadWtsApi;
 if  WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, @pProcessInfo, @ProcessCount) then
 begin
  CProcessInfo:=pProcessInfo;
  for i:=0 to ProcessCount-1 do
   begin
   PPID:=inttostr(cProcessInfo.ProcessId );
   ImageName:=cProcessInfo.pProcessName;
   if cProcessInfo.ProcessId<>0 then
   writeln('PID:'+PPID+'   进程名:'+ImageName)
   else
   writeln('PID:'+PPID+'   进程名:System Idle Process');
   CProcessInfo:=PWTS_PROCESS_INFO(pointer(dword(cProcessInfo)+sizeof(WTS_PROCESS_INFO)));//程序关键处
   end;
 end;
end;

#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、付费专栏及课程。

余额充值