//发送模拟按键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==0return 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 小鼬 阅读(1874) 评论(2)  编辑 收藏 引用 所属分类: 1.WIN程序设计

Feedback

# re: 发送模拟按键&&由进程名结束进程  回复  更多评论   

2008-09-16 13:36 by true
不错,很实用

# re: 发送模拟按键&&由进程名结束进程  回复  更多评论   

2008-09-17 17:05 by 土仔
实用,收藏!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理