CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

判断进程是否存在

楼主linkinwork(阿拉斯加雪橇犬)2006-01-23 14:56:19 在 VB / 基础类 提问

在任务管理器中映像名称如果是中文就不能正常显示?  
          我现在需要判断某个进程是否存在,可要是进程名称为中文  
          我就无法比较了,请问我该如何处理。谢谢!  
  问题点数:20、回复次数:20Top

1 楼xmf_jx()回复于 2006-01-23 15:10:59 得分 0

用API可以获取进程ID号,Top

2 楼faysky2(出来混,迟早是要还嘀)回复于 2006-01-23 15:28:05 得分 5

在xp下可以正常显示,其他系统就不知道了,你用下面的代码(查询进程代码)看看查到中文的进程名是否正常显示:  
   
  新建一个工程project1,窗口form1   ,加入一个listview   (lvwPrss)   3个button(cmdRefresh,cmdDelete,cmdExit)  
   
   
  代码如下  
   
   
  Option   Explicit  
   
  Private   Declare   Function   CloseHandle   Lib   "kernel32"   (ByVal   hObject   As   Long)   As   Long  
  Private   Declare   Function   ExitProcess   Lib   "kernel32"   (ByVal   hObject   As   Long)   As   Long  
  Private   Declare   Function   FindWindow   Lib   "user32"   Alias   "FindWindowA"   (ByVal   lpClassName   As   String,   ByVal   lpWindowName   As   String)   As   Long  
  Private   Declare   Function   GetWindowThreadProcessId   Lib   "user32"   (ByVal   hwnd   As   Long,   lpdwProcessId   As   Long)   As   Long  
  Private   Declare   Function   ReadProcessMemory   Lib   "kernel32"   (ByVal   hProcess   As   Long,   ByVal   lpBaseAddress   As   Any,   ByVal   lpBuffer   As   Any,   ByVal   nSize   As   Long,   lpNumberOfBytesWritten   As   Long)   As   Long  
  Private   Declare   Function   GetCurrentProcess   Lib   "kernel32"   ()   As   Long  
   
   
  Private   Const   LOCALE_STIMEFORMAT   =   &H1003  
  Private   Const   LOCALE_SSHORTDATE   =   &H1F  
  Private   Const   WM_SETTINGCHANGE   =   &H1A  
  Private   Const   HWND_BROADCAST   =   &HFFFF&  
   
  Private   Declare   Function   SetLocaleInfo   Lib   "kernel32"   Alias   "SetLocaleInfoA"   (ByVal   Locale   As   Long,   ByVal   LCType   As   Long,   ByVal   lpLCData   As   String)   As   Boolean  
  Private   Declare   Function   PostMessage   Lib   "user32"   Alias   "PostMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
  Private   Declare   Function   GetSystemDefaultLCID   Lib   "kernel32"   ()   As   Long  
   
   
   
  '***************************************  
   
  '获得进程的句柄  
  Private   Declare   Function   OpenProcess   Lib   "kernel32"   (ByVal   dwDesiredAccess   As   Long,   _  
  ByVal   blnheritHandle   As   Long,   ByVal   dwAppProcessId   As   Long)   As   Long  
  '终止进程  
  Private   Declare   Function   TerminateProcess   Lib   "kernel32"   (ByVal   ApphProcess   As   Long,   _  
  ByVal   uExitCode   As   Long)   As   Long  
  '创建一个系统快照  
  Private   Declare   Function   CreateToolhelp32Snapshot   Lib   "kernel32"   _  
  (ByVal   lFlags   As   Long,   lProcessID   As   Long)   As   Long  
  '获得系统快照中的第一个进程的信息  
  Private   Declare   Function   ProcessFirst   Lib   "kernel32"   Alias   "Process32First"   _  
  (ByVal   mSnapShot   As   Long,   uProcess   As   PROCESSENTRY32)   As   Long  
  '获得系统快照中的下一个进程的信息  
  Private   Declare   Function   ProcessNext   Lib   "kernel32"   Alias   "Process32Next"   _  
  (ByVal   mSnapShot   As   Long,   uProcess   As   PROCESSENTRY32)   As   Long  
   
  Private   Type   PROCESSENTRY32  
          dwSize   As   Long  
          cntUsage   As   Long  
          th32ProcessID   As   Long  
          th32DefaultHeapID   As   Long  
          th32ModuleID   As   Long  
          cntThreads   As   Long  
          th32ParentProcessID   As   Long  
          pcPriClassBase   As   Long  
          dwFlags   As   Long  
          szexeFile   As   String   *   260&  
  End   Type  
  Private   Const   TH32CS_SNAPPROCESS   As   Long   =   2&  
  Dim   mresult  
   
   
  Private   Sub   cmdRefresh_Click()  
          doList  
  End   Sub  
   
   
  Private   Sub   Form_Load()  
          lvwPrss.ListItems.Clear  
          lvwPrss.ColumnHeaders.Clear  
          lvwPrss.ColumnHeaders.Add   ,   ,   "进程ID",   1500  
          lvwPrss.ColumnHeaders.Add   ,   ,   "进程名",   5600  
          lvwPrss.LabelEdit   =   lvwManual  
          lvwPrss.FullRowSelect   =   True  
          lvwPrss.HideSelection   =   False  
          lvwPrss.HideColumnHeaders   =   False  
          lvwPrss.View   =   lvwReport  
  End   Sub  
  Private   Sub   Form_Activate()  
          doList  
  End   Sub  
  'listview的大小随窗体变化  
  Private   Sub   Form_Resize()  
          lvwPrss.Move   0,   0,   Me.ScaleWidth   -   cmdRefresh.Width,   Me.ScaleHeight  
          cmdRefresh.Move   lvwPrss.Width   -   lvwPrss.Left  
          cmdDelete.Move   lvwPrss.Width   -   lvwPrss.Left  
          cmdExit.Move   lvwPrss.Width   -   lvwPrss.Left  
  End   Sub  
   
  Private   Sub   doList()  
          Dim   uProcess   As   PROCESSENTRY32  
          Dim   mSnapShot   As   Long  
          Dim   mName   As   String  
          Dim   i   As   Integer  
          Dim   mlistitem   As   ListItem  
             
          lvwPrss.ListItems.Clear  
          DoEvents  
          uProcess.dwSize   =   Len(uProcess)  
          mSnapShot   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0&)  
          If   mSnapShot   Then  
                  mresult   =   ProcessFirst(mSnapShot,   uProcess)  
                  '失败则返回false  
                  Do   While   mresult  
                          i   =   InStr(1,   uProcess.szexeFile,   Chr(0))  
                          mName   =   LCase$(Left$(uProcess.szexeFile,   i   -   1))  
                          Set   mlistitem   =   lvwPrss.ListItems.Add(,   ,   Text:=uProcess.th32ProcessID)  
                          mlistitem.SubItems(1)   =   mName  
                          mresult   =   ProcessNext(mSnapShot,   uProcess)  
                  Loop  
          End   If  
          cmdDelete.Enabled   =   (lvwPrss.ListItems.Count   >   0)  
  End   Sub  
   
  '强行终止当前进程  
  Private   Sub   cmdDelete_Click()  
          If   lvwPrss.ListItems.Count   =   0   Then  
                  Exit   Sub  
          End   If  
          If   MsgBox("真的终止"   &   lvwPrss.Name   &   "   进程吗?",   vbYesNo   +   vbQuestion)   <>   vbYes   Then  
                  Exit   Sub  
          End   If  
             
          Dim   mProcID   As   Long  
          mProcID   =   OpenProcess(1&,   -1&,   lvwPrss.SelectedItem)  
          TerminateProcess   mProcID,   0&  
          DoEvents  
          lvwPrss.ListItems.Remove   (lvwPrss.SelectedItem.Index)  
          lvwPrss.Refresh  
  End   Sub  
   
   
  '显示错误信息  
  Sub   ErrMsgProc(mMsg   As   String)  
          MsgBox   mMsg   &   vbCrLf   &   Err.Number   &   Space(5)   &   Err.Description  
  End   Sub  
   
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
          Unload   Form1  
  End   Sub  
  Top

3 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-23 15:35:18 得分 0

我试过了!中文不能正确显示.  
  我用的是windows2000   高级服务器版Top

4 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 13:32:41 得分 0

自己顶!Top

5 楼lsftest()回复于 2006-01-25 17:56:46 得分 5

回复人:   linkinwork(阿拉斯加雪橇犬)   (   )   信誉:85     2006-01-23   15:35:00     得分:   0      
     
     
        我试过了!中文不能正确显示.  
  我用的是windows2000   高级服务器版  
       
     
  ======================  
  那么有没有试过访问wmi的win32_process????Top

6 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 19:09:41 得分 0

没有?   wmi的win32_process是指什么?Top

7 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 19:37:05 得分 10

直接根据程序名判断试试Top

8 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 19:53:31 得分 0

程序名称是中文的,可在任务管理器中看到对应的映像名称就变成问号或别的字符了。  
  我想知道他们之间是怎么转换的。谢谢!Top

9 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 20:58:39 得分 0

//程序名称是中文的,可在任务管理器中看到对应的映像名称就变成问号或别的字符了。  
   
  这个程序如果是vb程序的话,通常是编译时,vb未打补丁所致Top

10 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 20:59:54 得分 0

另外,你可以考虑根据文件路径判断一下Top

11 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 21:22:25 得分 0

恩.程序是vb做的。请问这个补丁能自己手工打上吗?  
  能给些这方面的资料吗?谢谢!  
   
  我试一下根据文件路径判断!!先谢了!  
   
  Top

12 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 21:42:42 得分 0

//请问这个补丁能自己手工打上吗?  
   
  我说的补丁是指vb的补丁,现在出到sp6了,你下载解压后,关闭vb,直接运行里面的setupsp6.exe就可以了,如果程序已经编译好了,你又没有源程序的话,就只有用资源编辑工具修改了Top

13 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 22:09:20 得分 0

SP6我一直都有装  
  我的程序是在打了SP6的VB里开发编译的。Top

14 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 22:56:58 得分 0

这样吧,详细说说你打算干什么吧,我看能不能变通一下Top

15 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 23:00:58 得分 0

好的。  
  我现在想根据程序名称检测这个程序是否已经运行了。Top

16 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-25 23:07:41 得分 0

根据文件路径判断应该可以实现吧!!Top

17 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-25 23:58:48 得分 0

没问题,可以实现,但判断之后干什么?Top

18 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-26 00:02:01 得分 0

哦。我做了一个自动升级程序。  
  就是替换程序文件。  
  发现进程存在之后,提示用户退出.  
  并不自动关闭进程。Top

19 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-26 00:16:40 得分 0

这样试试:  
  在程序中以独占方式打开要检测的程序,如果程序已经运行,就会产生一个错误,这时,就可以利用错误陷阱捕获错误,判断程序是否已经运行了Top

20 楼linkinwork(阿拉斯加雪橇犬)回复于 2006-01-26 00:24:11 得分 0

恩。谢谢!  
  这个方法是很不错。  
  是这样的。我们头让按照系统设计作。  
  设计上让我从一个ini文件中读取要升级程序的名称  
  然后判断进程是否存在。呵呵!  
   
   
   
  Top

相关问题

  • 在Unix下怎样判断一个进程是否还存在?
  • 知道应用程序名,怎样判断其进程是否存在?
  • 请问soralis下怎么写脚本判断进程是否存在,不存在则启动?
  • unix编程:怎么判断一个进程是否存在呢?有无系统调用方法?
  • 判断IFRAME是否存在
  • 判断session是否存在
  • 如何判断Form是否存在?
  • 如何判断表是否存在?
  • 怎样判断目录是否存在?
  • 判断文件夹是否存在

关键词

  • win32
  • windows2000
  • 中文
  • 编译
  • 文件
  • 代码
  • vb
  • 程序
  • 进程
  • longprivate

得分解答快速导航

  • 帖主:linkinwork
  • faysky2
  • lsftest
  • rainstormmaster

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo