CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

closewindow 和 postmessage关闭别的应用程序有何不同?

楼主jack20042005()2006-07-03 13:34:52 在 VB / 基础类 提问

1.在网上搜了两天,可是没有详细的对比说明  
   
  2.网上很说说窗体句柄,是不是所有在运行的应用程序都有窗体呢(比如word、ms-dos、dll等)?  
   
  3.好像   还有一个sendmessage,  
  没熟悉api,比较晕啊  
  请高手讲讲  
   
  4.另谁能贴下他们各自的参数取值表 问题点数:80、回复次数:14Top

1 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 13:47:19 得分 50

closewindow    
    postmessage  
  sendmessage差别很大  
  首先CloseWindow不是真正的关闭只是最小化指定的窗口窗口不会从内存中清除  
  VB声明    
  Declare   Function   CloseWindow   Lib   "user32"   Alias   "CloseWindow"   (ByVal   hwnd   As   Long)   As   Long    
  说明    
  最小化指定的窗口。窗口不会从内存中清除    
  返回值    
  Long,非零表示成功,零表示失败。会设置GetLastError    
  参数表    
  参数   类型及说明    
  hwnd   Long,欲最小化的那个窗口的句柄    
   
   
  postmessage   sendmessage都是发送一个关闭命令给一个程序  
   
  但他们也有区别  
   
  postmessage是将命令发送到程序的命令队列里  
   
  不管他的返回状态  
   
  sendmessage则不同  
   
        PostMessage只负责将消息放到消息队列中,不确定何时及是否处理  
          SendMessage要等到受到消息处理的返回码(DWord类型)后才继续  
          PostMessage执行后马上返回  
          SendMessage必须等到消息被处理后才会返回。Top

2 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 13:50:09 得分 0

窗体句柄不是每个程序都有的 比如dll一般就没有窗体  
   
  建议你还是看看一些入门书籍  
   
   
  PostMessage详细参数  
  VB声明    
  Declare   Function   PostMessage&   Lib   "user32"   Alias   "PostMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)  
  Declare   Function   PostMessageByNum&   Lib   "user32"   Alias   "PostMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)  
  Declare   Function   PostMessageByString&   Lib   "user32"   Alias   "PostMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   String)    
  说明    
  将一条消息投递到指定窗口的消息队列。投递的消息会在Windows事件处理过程中得到处理。在那个时候,会随同投递的消息调用指定窗口的窗口函数。特别适合那些不需要立即处理的窗口消息的发送    
  返回值    
  Long,如消息投递成功,则返回TRUE(非零)。会设置GetLastError    
  参数表    
  参数   类型及说明    
  hwnd   Long,接收消息的那个窗口的句柄。如设为HWND_BROADCAST,表示投递给系统中的所有顶级窗口。如设为零,表示投递一条线程消息(参考PostThreadMessage)    
  wMsg   Long,消息标识符    
  wParam   Long,具体由消息决定    
  lParam   Any,具体由消息决定    
   
   
   
   
  SendMessage详细参数  
  VB声明    
  Declare   Function   SendMessage&   Lib   "user32"   Alias   "SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)  
  Declare   Function   SendMessageBynum&   Lib   "user32"   Alias   "SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)  
  Declare   Function   SendMessageByString&   Lib   "user32"   Alias   "SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   String)    
  说明    
  调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum,   SendMessageByString是该函数的“类型安全”声明形式    
  返回值    
  Long,由具体的消息决定    
  参数表    
  参数   类型及说明    
  hwnd   Long,要接收消息的那个窗口的句柄    
  wMsg   Long,消息的标识符    
  wParam   Long,具体取决于消息    
  lParam   Any,具体取决于消息    
   
  Top

3 楼jabeginner(开拓者)回复于 2006-07-03 13:52:07 得分 10

建议lz到里面去看看,学学API.  
  http://www.programfan.com/vbapi.aspTop

4 楼zcsor(偶业余的虽然星星了,但是水平依然是非常业余的。)回复于 2006-07-03 13:55:51 得分 20

closewindow    
  close(退出)window   (窗体)  
  postmessage可以发送消息关闭窗体  
  SendMessage   也可以具体使用方法如下  
  常数声明:(API声明自己去复制吧)  
  Public   Const   WM_SYSCOMMAND   =   &H112  
  Public   Const   SC_CLOSE   =   &HF060&   '关闭窗体,这里用的不是WM_CLOSE  
  代码如下:  
  SendMessage   me.hwnd,   WM_SYSCOMMAND,   SC_CLOSE,   ByVal   0&   'byval   0&   可以换成vbnullstring。  
   
  恩,句柄,也就是一个标志,通过这个标志操作系统能识别谁是谁,也就是一个名字,当然了,好多东东都有句柄,象  
  窗体或控件:句柄就是HWND   我们用HWND来标志一个窗体,通过这个标志,就可以对窗体进行操作,象看看它的标题,让他最大化,让他在别人上面等等啦  
  进程:句柄就是PID(PROCESSID)我们用PID来标志一个进程,通过这个标志,我们可以操作进程,例如让他具有更高的优先级,关闭它,挂起他,向他的内存空间写入数据,读数据等等啦  
  设备场景:句柄就是DC,我们用DC来标志一个设备场景,例如一个窗体,一个图片框(PICTUREBOX),一个按钮,通过这个标志,我们可以在上面画画,写字,甚至可以禁止他刷新,清除里面的内容,等等  
  还有好多啊,象线程ID,设备ID等等,我们都可称为句柄,其实呢,就是一个名字啦,  
  形象的说,有这么一个班,  
  班里面的同学(窗口),他们都有学号(HWND),你想提问一个同学(对某个窗口进行操作),可以通过他的学号啊(HWND)  
  嘿嘿,其实啊,这个HWND,PID,DID,SID等等吧,都是系统维护的,也就是说都是班主任按一定规则编排好的,哈哈  
   
  我就是这么理解的,嘿嘿,爱怎么着怎么着吧,反正是个业余爱好者,学那么多也没啥用  
  Top

5 楼jack20042005()回复于 2006-07-03 14:42:09 得分 0

谢谢  
   
  根据楼上说   句柄就是进程,也就是说获取的句柄号就是任务管理器中显示的该程序的pid了Top

6 楼jack20042005()回复于 2006-07-03 14:44:36 得分 0

可是不对啊  
  vb获取的“句柄”和在任务管理器中的“pid”不一样  
   
  怎么理解它们呢?Top

7 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 14:56:19 得分 0

pid是系统分配给进程的  
   
  而vb获取的“句柄”不仅仅是进程的东西 他还可以是 文本框或者信息框比如msgbox  
   
  而这些东西在系统中不是以pid形式来显示的比如一个进程在系统中pid   是1000  
   
  但是他上面有文本框和图片框还能弹出对话框 这些都有句柄 因此句柄和pid不是一回事  
   
  具体你还是看看书吧 说自己都说迷糊了有点  
  Top

8 楼jack20042005()回复于 2006-07-03 15:37:07 得分 0

再问两个小问题:  
  1.程序的pid与该程序的窗体句柄之间有没有对应的算法联系?  
   
   
  2.aspower上面给的声明  
  Declare   Function   PostMessage&   Lib   "user32"   Alias   "PostMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)  
     
  其中的PostMessage后为何要加个&呢,我在vb的api浏览器里面得到的可没有&呀,加与不加有什么关系?Top

9 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 15:41:09 得分 0

...........  
  不加的  
  那个是失误Top

10 楼jack20042005()回复于 2006-07-03 15:42:56 得分 0

不是失误吧    
  我原来用过加&的   但不喜欢这个形式  
   
  只是不知道什么意思Top

11 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 15:50:15 得分 0

每个窗口对应一个hwnd,  
   
  一个程序对应一个pid  
  一个程序可能有很多个窗口  
  所以pid和窗口句柄不是一回事  
   
  进程ID~  
  GetWindowThreadProcessId    
  VB声明    
  Declare   Function   GetWindowThreadProcessId   Lib   "user32"   Alias   "GetWindowThreadProcessId"   (ByVal   hwnd   As   Long,   lpdwProcessId   As   Long)   As   Long  
     
  说明    
  获取与指定窗口关联在一起的一个进程和线程标识符    
  返回值    
  Long,拥有窗口的线程的标识符    
  参数表    
  参数   类型及说明    
  lpdwProcessId   Long,指定一个变量,用于装载拥有那个窗口的一个进程的标识符    
  hwnd   Long,指定窗口句柄    
  Top

12 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 15:51:30 得分 0

那个也能行吗?  
   
  我没试过  
   
  api浏览器里是没有的Top

13 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-03 15:54:39 得分 0

用pid查进程的代码也有  
   
  寒江雪提供的  
   
  Private   Const   MAX_PATH   =   260  
  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   *   MAX_PATH  
  End   Type  
   
  Private   Declare   Function   CreateToolhelp32Snapshot   Lib   "kernel32"   (ByVal   dwFlags   As   Long,   ByVal   th32ProcessID   As   Long)   As   Long  
  Private   Declare   Function   Process32First   Lib   "kernel32"   (ByVal   hSnapshot   As   Long,   lppe   As   Any)   As   Long  
  Private   Declare   Function   Process32Next   Lib   "kernel32"   (ByVal   hSnapshot   As   Long,   lppe   As   Any)   As   Long  
   
  Private   Const   TH32CS_SNAPHEAPLIST   =   &H1  
  Private   Const   TH32CS_SNAPPROCESS   =   &H2  
  Private   Const   TH32CS_SNAPTHREAD   =   &H4  
  Private   Const   TH32CS_SNAPMODULE   =   &H8  
  Private   Const   TH32CS_SNAPALL   =   (TH32CS_SNAPHEAPLIST   +   TH32CS_SNAPPROCESS   +   TH32CS_SNAPTHREAD   +   TH32CS_SNAPMODULE)  
  Private   Const   TH32CS_INHERIT   =   &H80000000  
   
  Private   Sub   Command1_Click()  
          '查找进程  
          Dim   hSnapshot           As   Long,   P               As   PROCESSENTRY32  
          Dim   exitCode           As   Long  
          Dim   myProcess           As   Long  
   
          P.dwSize   =   Len(P)  
          hSnapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPALL,   ByVal   0)  
          If   hSnapshot   Then  
                  lRet   =   Process32First(hSnapshot,   P)  
                  Do   While   lRet  
                          If   InStr(P.szExeFile,   "calc.exe")   <>   0   Then  
                                  MsgBox   P.th32ProcessID  
                          End   If  
                          lRet   =   Process32Next(hSnapshot,   P)  
                  Loop  
          End   If  
  End   Sub  
   
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:jack20042005
  • aspower_
  • jabeginner
  • zcsor

相关链接

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

广告也精彩

反馈

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