发送模拟按键&&由进程名结束进程

//发送模拟按键ctrl+eSC和‘U’; 由进程名结束进程
//、、、自己关机的个东西

#ifndef WINVER    
//  允许使用特定于 Windows XP 或更高版本的功能。
#define  WINVER 0x0501   //  将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT  
//  允许使用特定于 Windows XP 或更高版本的功能。
#define  _WIN32_WINNT 0x0501  //  将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif       

#ifndef _WIN32_WINDOWS  
//  允许使用特定于 Windows 98 或更高版本的功能。
#define  _WIN32_WINDOWS 0x0410  //  将此值更改为适当的值,以指定将 Windows Me 或更高版本作为目标。
#endif

#ifndef _WIN32_IE   
//  允许使用特定于 IE 6.0 或更高版本的功能。
#define  _WIN32_IE 0x0600  //  将此值更改为相应的值,以适用于 IE 的其他版本。
#endif

#define  WIN32_LEAN_AND_MEAN   //  从 Windows 头中排除极少使用的资料


#include 
< windows.h >
#include 
< tlhelp32.h >   
#include 
< stdlib.h >
#define  num 2  // 要结束的进程的数量
LPSTR lpsz[num]
= { " IEXPLoRE.EXE " , " k-meleon.exe " };

DWORD WINAPI StopProcess(LPVOID lpParam);

int  main(){
HANDLE hThread;

KEYBDINPUT  ki[
9 ] = {
{VK_SHIFT,MapVirtualKey(VK_SHIFT, 
0 ),KEYEVENTF_KEYUP, 0 , 0 },
{VK_MENU,MapVirtualKey(VK_MENU, 
0 ),KEYEVENTF_KEYUP, 0 , 0 },
{
' U ' ,MapVirtualKey( ' U ' 0 ),KEYEVENTF_KEYUP, 0 , 0 },

{VK_CONTROL,MapVirtualKey(VK_CONTROL, 
0 ), 0 , 0 , 0 },
{VK_ESCAPE,MapVirtualKey(VK_ESCAPE, 
0 ), 0 , 0 , 0 },
{VK_ESCAPE,MapVirtualKey(VK_ESCAPE, 
0 ),KEYEVENTF_KEYUP, 0 , 0 },
{VK_CONTROL,MapVirtualKey(VK_CONTROL,
0 ),KEYEVENTF_KEYUP, 0 , 0 },

{
' U ' ,MapVirtualKey( ' U ' 0 ), 0 , 0 , 0 },
{
' U ' ,MapVirtualKey( ' U ' 0 ),KEYEVENTF_KEYUP, 0 , 0 }
};

INPUT inputs[
9 ];
for ( int  i = 0 ;i != 9 ;i ++ ){
    inputs[i].type 
=  INPUT_KEYBOARD;
    inputs[i].ki 
=  ki[i];
}

// 结束进程:
hThread = CreateThread(NULL,  0 , StopProcess, NULL,  0 , NULL);
SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
// WaitForSingleObject只是查询,还是得CloseHandle回收资源

// 关机界面:
SendInput( 7 ,inputs, sizeof (inputs[ 0 ]));
//这里sleep的时间得根据自己机子设置 最多sleep500足够了 我机子sleep100有时不行
Sleep(3
00 ); // 难道必须sleep?不能一次SendInput()?不是说SendInput发送的是流么
SendInput( 2 , & inputs[ 7 ], sizeof (inputs[ 0 ]));

}

// 认为同一名字的进程只有一个。 (算法上还可以更…)
DWORD WINAPI StopProcess(LPVOID lpParam){
  HANDLE   hSnapshot
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 );   
  PROCESSENTRY32   pe;   
  
int  k(num);
  HANDLE   hProcess;   
  
if (k == 0 return   0 ;
  Process32First(hSnapshot,
& pe);   
  
do    
  {   
      
for ( int  i = 0 ;i != num;i ++ )
          
if (lstrcmpi(pe.szExeFile,lpsz[i]) == 0 )   
          {   
              k
-- ;
              hProcess
= OpenProcess(PROCESS_TERMINATE,FALSE,pe.th32ProcessID);   
              
if  (hProcess) {
                  TerminateProcess(hProcess,
0 ); // 关闭进程   
                  CloseHandle(hProcess); // OpenProcess打开的也要关闭
              }
          }   
  }
while (Process32Next(hSnapshot, & pe)  &&  k);   
  CloseHandle(hSnapshot); 
  
return   0 ;
}
Posted on 2008-09-16 12:09 小鼬 阅读(1705) 评论(2)   编辑  收藏 引用 所属分类: 1.WIN程序设计

你可能感兴趣的:(发送模拟按键&&由进程名结束进程)