Process Thread Window之关系

许多人包括我自己,对於window与process或Thread间的对应,常感困扰,我就目前所知者,大概的介绍一下:一个Process有自己4GB的位址空间,这个观念比较容易接受,但是它却不是执行程式的单位,真正执行程式者是Thread,每个Process被Create时,便会有一个主thread 来执行它,我们又可以Create其他的Thread来执行程式,假设现在就有两个thread於这个Process了,那麽,这两个Thread原则上是共用Process的同一个位址空间,例如:背景列印,但是至少有两个Thread在做事,它的好处不用说明太多大家都可以明白,但它同时也会有其他问题(如同步、如果一个thread一个不小心当了,那有可能会使整个Process死掉),这些不在讨论范围。而window呢,它一定有一个thread来执行它,但一个Thread却可以有不只一个的 Windows或根本没有。另外,一个Process有一个的唯一的Process ID而每个Thread也有唯一的ThreadID,而控制Process 则大多透过Process Handle(hProcess)而非 Process ID,正如透过hWnd来控制Window一样。如同前面所言,一个window有一个Thread在执行它,那该如何取得呢?请用 Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hwnd As Long, lpdwProcessId As Long) As Long 这个function传入一个hwnd而取得Process ID(其第二个叁数),而传回值是 ThreadID。而使用OpenProcess()来取得Process Handle,底下程式的目的是取得 Window ClassName, 与Window Title,我们搜寻window时,常使用FindWindow() 但这个function传入的叁数第一个便是Window ClassName,但我们经常不知道 ClassName透过它,我们可轻易来得知,进而做许多的控制。 程式使用方式: 1.先将想查询的window叫出,放在桌面上 2.执行本程式,把不必要的window关掉,直到想查询的window看得见(不必全部) 3.在form1的Command1上按下mouse的右键不要放掉,这时会看到mouse变问号加箭头 而且form1不见了,代表您可以拖拉mouse了。 4.移到想查询的window上面,放掉mouse,而後form1再度出现,上有所要的资讯

一个form , 一个ommandBox, 2 labels
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long,  al X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, _
ByVal yPoint As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
(ByVal hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Const HWND_TOP = 0
Const HWND_BOTTOM = 1
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const PROCESS_QUERY_INFORMATION = &H400
Private TitleName As String
Private ClassName As String
Private hProcess As Long
Private Candisplay As Boolean
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer,
  X As Single, Y As Single)
Dim aa As Long
If Button = vbRightButton Then
将window设定成在底层
aa = SetWindowPos(Me.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
Me.MousePointer = vbArrowQuestion
End If
End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single,
Y As Single)
Dim aa As Long
Dim pt As POINTAPI
Dim hwnd5 As Long
Dim str5 As String
Dim len5 As Long
Dim thrid As Long, pid As Long
If Button = vbRightButton Then
设定window到上层
aa = SetWindowPos(Me.hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
Me.MousePointer = vbDefault
取得mouse目前的座标,不能用mouseup Event的x,y因那是相对於form的座标
aa = GetCursorPos(pt)
取得pt所在座标,是落在那一个window上面
hwnd5 = WindowFromPoint(pt.X, pt.Y)
len5 = 256
ClassName = String(255, 0)
取得该window的Class name
aa = GetClassName(hwnd5, ClassName, len5)
ClassName = Left(ClassName, aa)
len5 = 256
TitleName = String(255, 0)
取得该window的title
aa = GetWindowText(hwnd5, TitleName, len5)
TitleName = Left(TitleName, aa)
依hwnd取得相对应的threadID(thrid), ProcessID(pid)
thrid = GetWindowThreadProcessId(hwnd5, pid)
取得Process Handle
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
有了hProcess那可做事可多啦,例如:可侦测 它何时结束,或强制它结束等等
Call TerminateProcess(hProcess, 38) 最好别这麽做,否则,嘿嘿,你自己试
Label1.Caption = " Title = " + TitleName
Label2.Caption = "Calss Name = " + ClassName
End If
End Sub

时间: 2025-01-06 18:20:09

Process Thread Window之关系的相关文章

Oracle中的Connect/session和process的区别及关系介绍_oracle

Session:在计算机中,尤其是在网络应用中,称为"会话". Session:在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间. Connect.session.process的区别: 一个数据库的Connect可以有一个或多个session,同时connect也可以有一个或多个process. 在专业服务器连接方式中,一个session对应一个process,在共享服务器方式中,一个process可以

Activity, Service,Task, Process and Thread之间的关系

Activity, Service,Task, Process and Thread之间到底是什么关系呢? 首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class

Process, Thread, STA, MTA, COM object

这写得蛮易懂:http://www.cnblogs.com/holly/archive/2009/04/24/1443213.html

泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process

  在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process->Sink所组成的.我们发现:Process[I,O]本身是无法兼顾Source和Sink的功能.而独立附加的Source和Sink又无法有效地与Process[I,O]进行函数组合(functional composition).   实际上Process[I,O]是一种固定单一输入类型(sin

Flink 原理与实现:Window 机制

Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理.而窗口(window)就是从 Streaming 到 Batch 的一个桥梁.Flink 提供了非常完善的窗口机制,这是我认为的 Flink 最大的亮点之一(其他的亮点包括消息乱序处理,和 checkpoint 机制).本文我们将介绍流式处理中的窗口概念,介绍 Flink 内建的一些窗口和 Window API,最后讨论下窗口在底层是如何实现的. 什么是 Win

卸载VS2011 Developer Preview后Sql Server2008 R2建立数据库关系图报“找不到指定的模块”错误的解决方法_MsSql

可怜我的C盘本来只有8.XG,所以不得不卸载掉它. 卸载掉本身没啥问题,只是昨晚突然发现 Sql Server 2008 R2 Management Studio 突然不能新建数据库关系图了,一建立就会报"找不到指定的模块(MS Visual Database Tools)"的错误: 为了这个错误我甚至认真评估了重新配置数据库的可能性.无奈这个R2的SQL2008打过SP1了,无论是修复还是重装都是很花时间的事情,所以不甘心,在Google上找了一圈.终于找到个类似的主题反应了这个问题

JAVA多线程之Thread&&Runnable 示例

看了个视频,嗯,记录下加深下理解...java实现多线程的两种方式:继承thread类,这种方式的缺陷就是java的单继承导致的:还有一种方式就是实现Runnable接口,这种方式避免了thread方式由于java单继承带来的缺陷.需要知道的是线程启动后会抢占CPU资源,如果当前new了一个线程,线程就会进入创建的状态,然后我们启动这个线程,thread.start(),这个时候这个线程就会处在就绪状态,如果当前能获取到CPU资源,然后就会处在运行状态,如果这个时候执行了sleep方法或者一些阻

Apache Samza - Reliable Stream Processing atop Apache Kafka and Hadoop YARN

前两年一直在使用Kafka, 虽说Kafka一直说可用于online分析, 但是实际在使用的时候会发现问题很多, 比如deploy, 调度, failover等, 我们也做了一些相应的工作  Samza算是把这个补全了, 可以更加简单的在Kafka上进行online分析, 所以看着比较亲切   1 Background 首先对messaging系统和stream processing系统的阐述, 很清晰  messaging系统, 数据的传递, 是比较low-level infrastructu

【OS】OSWbb(OSWatcher Black Box)的简介和使用

[OS]OSWbb(OSWatcher Black Box)的简介和使用 OSWatcher Black Box, 简称OSW,是Oracle提供的一个小但是非常有用的工具,它通过调用OS自己提供的命令来记录OS运行时的一些性能参数,比如CPU/Memory/Swap/Network IO/Disk IO相关的信息. +++ 为什么一定要部署OSW? OSW并不是强制要部署的,并且有很多工具可以提供一样的功能,比如说mrtg, cacti, sar, nmon, enterprise mange