closewindow 和 postmessage关闭别的应用程序有何不同?
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




