象外行一样思考,象专家一样实践。
coolbean | 29 八月, 2007 05:12
coolbean | 29 八月, 2007 04:15
这个问题是CSDN网友MattHgh (黎明破晓前)提出来的,这个问题其实有很多种解决的办法,这里我用WH_SHELL钩子解决,WH_SHELL钩子可以获得很多信息,比如窗口创建、窗口销毁、窗口被激活、窗口的标题栏被重绘等等,但是这些信息都是基于窗口的,而MattHgh 希望同时获得相应的程序。那么怎么根据窗口的句柄的句柄获得对应的程序路径呢,这个当然可以通过枚举所有的进程获得,不过这样一来,速度就慢上一些了,我在程序中用到的是另外一种方法,这种方法尽管很平常,但我估计有些朋友可能还不知道,所以下面我用程序简单的说明一下:
'根据窗口句柄获取对应的程序路径,只适用于NT平台
Public Function GetEXEFromHandle(Optional ByVal nHWnd As Long = 0) As String
Dim nProcID As Long
Dim nResult As Long
Dim nTemp As Long
Dim lModules(1 To 200) As Long
Dim sFile As String
Dim hProcess As Long '
If nHWnd = 0 Then nHWnd = GetForegroundWindow()
'获得窗口的ProcessID
If GetWindowThreadProcessId(nHWnd, nProcID) <> 0 Then
'打开Process,获得窗口对应的进程句柄
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
PROCESS_VM_READ, 0, nProcID)
If hProcess <> 0 Then
' 获得窗口对应的Module
nResult = EnumProcessModules(hProcess, lModules(1), _
200, nTemp)
If nResult <> 0 Then
'获得程序名
sFile = Space$(260)
nResult = GetModuleFileNameEx(hProcess, 0, sFile, Len(sFile))
sFile = LCase$(Left$(sFile, nResult))
GetEXEFromHandle = sFile
End If
'关闭Process
CloseHandle hProcess
End If
End If
End Function
请注意函数开始时的注释,这种方法只适用于NT平台,所以用win9x的朋友还是老老实实的枚举进程吧,这样的代码在网上很容易找到,这里我就不罗嗦了。
下面说说WH_SHELL钩子,MSDN上对这个钩子的描述是这样的:
coolbean | 29 八月, 2007 01:02
下列快捷组合键可在文本编辑器中用于在打开的文档中删除、移动或者格式化文本。
| 命令 | 快捷键 | 说明 |
|---|---|---|
编辑.分行 | Enter Shift + Enter | 插入一个新行。 |
编辑.折叠到定义 | Ctrl + M,Ctrl + O | 自动确定在代码中创建区域(如过程)的逻辑边界,然后隐藏它们。 |
编辑.注释选定内容 | Ctrl + K,Ctrl + C | 使用编程语言的正确注释语法将代码的当前行标记为注释。 |
编辑.删除水平空白 | Ctrl + K,Ctrl + | 折叠选定内容中的空白,如果没有选定内容,则删除与光标相邻的空白。 |
编辑.编排文档格式 | Ctrl + K,Ctrl + D | 按“选项”对话框“文本编辑器”部分中的语言的“格式设置”窗格中的指定,应用该语言的缩进和空格格式设置。 |
编辑.格式化选定内容 | Ctrl + K,Ctrl + F | 根据周围的代码行,正确缩进选定的代码行。 |
编辑.隐藏选定内容 | Ctrl + M,Ctrl + H | 隐藏选定文本。信号图标标记隐藏文本在文件中的位置。 |
编辑.插入制表符 | Tab | 将文本行缩进指定数量的空格,如 5 个。仅在 .NET Framework 设计器中可用。 |
编辑.剪切行 | Ctrl + Y | 将选择的所有行(或当前行,如果未选择任何行)剪切到剪贴板。 |
编辑.删除行 | Ctrl + Shift + Y | 删除所有选定行或当前行(如果没有选定行)。 |
编辑.上开新行 | Ctrl + Enter | 在插入点之上插入一个空行。 |
编辑.下开新行 | Ctrl + Shift + Enter | 在插入点之下插入一个空行。 |
编辑.行转置 | Shift + Alt + T | 将包含插入点的行移动到下一行之下。 |
编辑.改写模式 | Insert | 改写文档中已有的字符,而不是插入字符。仅在文本编辑器中可用。 |
编辑.停止隐藏当前区域 | Ctrl + M,Ctrl + U | 移除当前选定区域的大纲显示信息。 |
编辑.停止大纲显示 | Ctrl + M,Ctrl + P | 从整个文档中移除所有大纲显示信息。 |
编辑.交换定位点 | Ctrl + R,Ctrl + P | 交换当前选定内容的定位点与结束点。 |
编辑.左缩进 | Shift + Tab | 将选定行左移一个制表位。仅在 .NET Framework 设计器中可用。 |
编辑.切换所有大纲显示 | Ctrl + M,Ctrl + L | 在隐藏和显示状态之间切换所有以前被标记为隐藏的文本部分。 |
编辑.切换书签 | Ctrl + K,Ctrl + K | 在当前行处设置或移除书签。 |
编辑.切换大纲显示展开 | Ctrl + M,Ctrl + M | 在隐藏和显示状态之间切换当前选定的隐藏文本部分。 |
编辑.切换任务列表快捷方式 | Ctrl + K,Ctrl + H | 在当前行处设置或移除快捷方式。 |
编辑.取消注释选定内容 | Ctrl + K,Ctrl + U | 从代码的当前行中移除注释语法。 |
编辑.查看空白 | Ctrl + R,Ctrl + W | 显示或隐藏空格和制表符标记。 |
编辑.字转置 | Ctrl + Shift + T | 对调插入点两边的单词。 |
视图.显示引用 | Alt + F12 | 执行区分大小写的全字符号搜索并在“查找符号结果”窗口中显示结果。 |
| « | 八月 2007 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||