自制api进程管理器(自制api进程管理器怎么用)

网友投稿 384 2023-03-03


本篇文章给大家谈谈自制api进程管理器,以及自制api进程管理器怎么用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享自制api进程管理器的知识,其中也会对自制api进程管理器怎么用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何在最短的时间用C++实现一个任务管理器,只有C++基础,不懂API函数,不懂windows核心编程

mfc的list控件学学,然后枚举系统进程,线程总数还有物理内存等的api查一下,比如说你想实现任务管理器的进程数,你就往上搜怎么用windows api实现枚举进程,最后用一个列表控件显示各个进程就行,这只是举个例子,你都可以类似的这样搜

可以在一个容器中同时运行多个应用进程吗?

一般不推荐在同一个容器内运行多个应用进程,如果有类似需求,可以通过额外的进程管理机制,比如supervisord来管理所运行的进程,我推荐你去看看时速云,他们是一家全栈云原生技术服务提供商,提供云原生应用及数据平台产品,其中涵盖容器云PaaS、DevOps、微服务治理、服务网格、API网关等。大家可以去体验一下。 如果我的回答能够对您有帮助的话,求给大大的赞。

API有什么作用,他的工作原理是什么?

这个我本来不想说的自制api进程管理器,不过也许你知道其它人不知道自制api进程管理器,这里为了照顾一下新手,不得不说些废话,请大家谅解。
Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。
使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。
以上为API的相关介绍,不过有些新手看了以后可能还是不怎么明白API到底有什么用?这里请不要着急,如果你有足够耐心的话,请慢慢往下看。
二、如何使用API?
估计这才是大家真正关心的,那么如何使用API呢?在了解API之前,先打开你的VB书,翻到过程函数这章来,在搞清楚API之前应该先搞懂过程函数是怎么一回事!如果你还不知道过程的工作方式,那么请先不要急着往下看,那样容易走很多弯路。
好了,当你理解了过程函数时,也就是你可以使用API的时候了,别把API看得太难,你就像使用过程函数一样使用API就可以了。首先,让我们看看一个简单的API,以下:
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
以上这个API的呢是起一个延时作用。你如果是刚接触API的话可能会感到API的书写及其复杂,而且会感到很不适应。其实这没什么的,慢慢习惯就好了。至于API这些复杂的书写你就不用操心了,在你安装VB的时候微软已经帮我们带上了API浏览器,这些全部都可以利用API浏览器帮我们自动生成。API浏览器的位置位于[开始菜单-程序-Microsoft Visual Basic 6.0 中文版-Microsoft Visual Basic 6.0 中文版工具-API 文本浏览器]。打开API浏览器,在最上面的一个文本框中输入Sleep,这时下面列表框中就会自动显示相应的API函数,然后点右边添加按钮即可,接着点击复制按钮,这时你就可以用Ctrl+V把声明的API添加到VB代码窗口中了。
这里我要说一下,有些新手可能还弄不明白。API的声明范围一般有两种模式,一种是Private(私有的),一种是Public(公用的)。一般Private是声明在类模块或窗体类中,Public声明在模块中。你在添加API的时候,添加按钮下面就有API的声明范围,可以根据自己的需要进行添加。这里我们一般选择私有的(Private)就可以了。
经过上面,我们知道如何添加API,接着我们分析一下API声明,这是你了解API必备的。首先看第一个单词Private,很显然,我上面刚刚讲过,这是申明一个私有的API变量。再看第二个Declare,这个单词帮我们告诉VB是在申明API函数,一般申明外在的API函数时都必须带上这个单词。第三个Sub,别告诉我你不知道什么意思?这就是我叫你先学习VB中过程函数的意思,这个说白了就是没有反回值,一般如果不是Sub而是Function都带有反回值的。第四个Lib,这个是告诉VB我们要声明哪一个DLL中的API函数,也就是告诉VB我们要申明第五个单词kernel32.dLL中的API,一般写DLL名称时都要用双引号括起来,如"user32"、"shell32.dll"等,至于后面的.dll这个可以带可不带。再来看第六个Alias,这个也是需要同后面一个一起用的,我们应该把第六个和第七个连起来一起看Alias "Sleep",这个意思表示将被调用的过程在DLL中还有另外的名称,这个是可选的。最后括号里面的,也就是和过程函数一样,你传入相应的值就可以了。
上面我们分析完API函数声明以后,接着我们就要自己动手写代码了。先把这个API复制到Form1代码窗口中,然后写如下代码:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
Sleep 2000
End Sub
解释一下,也就是在窗体启动时使用Sleep API进行延时2秒,后面的参数dwMilliseconds是表示你要延时的秒数,基本上和设置Timer中的秒数一样。你再看一下Sleep 2000的使用方式,是不是和使用VB过程函数一样呢?好了,我们的第一个VB API程序写完了,可以看到使用API并不是一件很难的事。
三、如何才能提升你对API的学习兴趣?
API,我常把它看做成过程函数,不过每人都有每人的见解和理解方式,自己的理解方式只要可以帮助自己更好的学习和掌握API,也没必要一定要学习他人的。
1,自己做MsgBox
了解API参数的使用方法是很重要的,这里我们不用VB的MsgBox,直接使用API弹出MsgBox消息框。首先,打开API浏览器,选择MessageBox,大家可以用这个API和VB内置的MsgBox比较一下,其实MsgBox也就是MessageBox的缩写,只不过一个是API,一个是VB内置的,但两者都是通过API进行工作的。好了,选择私有声明方式,粘贴到VB代码编辑窗口中,然后新建一个CommandButton,写入以下代码:
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA"
(ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String,
ByVal wType As Long) As Long
Private Sub Command1_Click()
MessageBox Me.hwnd, "这里是内容", "标题", 0
End Sub
先让我们来分析一下,首先看第一个参数Byval hWnd As Long,很显然这是一个长整形变量,所以我们这里需要传递的是数字,你可能会发现我们传递的并不是数字啊,而是 Me.hwnd??很奇怪是吗?如果你真的有此疑问说明你是真心想要学习好API的,现在就让我们来看看Me.hwnd到底是什么东西?以下摘自VB帮助文档:
hWnd 属性:返回窗体或控件的句柄。
句 柄:是由操作环境定义的一个唯一的整数值,它被程序用来标识或者切换到对象,如窗体或控件等。
现在估计你差不多就已经明白了,我们调用的hwnd其实是一个句柄整数值,你可以用 Msgbox Me.hwnd 看一下就知道了。至于Me这是一个关键字,代表当前Form窗体对象。如:Me.Caption="标题"、Me.BackColor=vbRed等。
接上面的,首先我们传入了Me.hwnd,表示是当前窗口调用MessageBox,这里告诉大家一个技巧,也就是以后凡是看到Byval hwnd As Long,一般都是需要传入句柄的,至于传入哪个对象句柄,那就要看你是怎么实现的了。
ByVal lpText As String,这个是字符串变量,标识着叫我们需要传入字符串进去,可以看里面的变量字符lpText,属于文本的意思,也就是说是用来显示MsgBox中的消息文本的。
ByVal lpCaption As String,也是字符串变量,还是传入字符串进去。在看里面的变量字符lpCaption,其实就是显示MsgBox标题的。
ByVal wType As Long,这是一个整形变量,需要传递整形数字,还是看里面的变量字符wType,标识着显示MsgBox类型,这里可以像VB的MsgBox一样使用,如这里可以传入:vbYesNo,vbOkCancel等,如果忽略那就传入0即可。
好了,按F5启动程序,点击Command1,接着就会弹出一个消息框,这里我们制作以及分析MsgBox已经完成了。希望你能在这段学习到一些知识。
2,来点实用的吧
就拿隐藏Windows任务管理器来说吧,这里只能隐藏任务管理器中的窗口,不能隐藏进程。(问:有没有隐藏进程的?答:你想干什么?),当程序运行后你无法从任务管理器的窗口中关闭程序,只能从进程中进行终止。好了,还是老规矩,打开API浏览器,输入GetWindow和ShowWindow两个API,声明范围还是私有的,复制粘贴到Form代码窗口中,嗯,好了?别急,还是API浏览器,选择Combox中的常数,输入GW_OWNER和SW_HIDE这两个API常数,然后粘贴到代码窗口中,问我这两个是干什么的?那就接着往下看吧。写入以下代码:
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long,
ByVal wCmd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long,
ByVal nCmdShow As Long) As Long
Private Const GW_OWNER = 4
Private Const SW_HIDE = 0
Private Sub Form_Load()
Dim lphWnd As Long
lphWnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow lphWnd, SW_HIDE
End Sub
又到了分析的时候了,这对刚入门的新手可谓是最激动的时候了。好了,还是老子,看看两个API的表面意思和传递值变量。
先看GetWindow,表面意思:获取窗口。传递值变量:hWnd整形句柄,wCmd整形命令值。
再看ShowWindow,表面意思:显示窗口。传递值变量:hWnd整形句柄,nCmdShow整形命令值。
然后是使用代码,先看lphWnd = GetWindow(Me.hwnd, GW_OWNER)这句,这句意思是获取当前窗口的所有者窗口句柄,可以看到GetWindow是Function过程函数,执行以后会返回相应的窗口句柄值,这个值为Long整形(同句柄)。接着调用ShowWindow lphWnd, SW_HIDE,这句意思是显示lphwnd这个句柄的窗口,关键一句是最后的SW_HIDE,这是API函数的常量。通过设置常量能让系统知道API到底应该怎么执行显示窗口,是显示?还是隐藏?Hide当然是隐藏的意思。好了,编译成Exe,运行后打开任务管理器,查看程序窗口,还有吗?
我又要说一下了,有些人可能不懂为什么要用GW_OWNER这些常量,这些到底有什么用?还有就是我怎么知道哪些API对应哪些的常量?其实这些常量你只要稍微注意一下就知道它们是怎么回事了,如在GetWindow中我使用GW_OWNER,在ShowWindow中我使用SW_HIDE这些常量都有一个共同的特点,就是他们都是以API的单词第一个字母为标准。如GetWindow相对应的常量就是Get(G)Window(W)=GW,ShowWindow相对应的常就是Show(S)Window(W)=SW,这些常量可以自己在VB的API浏览器中找找看。
3,我还想写下去,不过我不知道写得怎么样,先发出来看看大家的反应再说。大家如果发现有什么不对的地方尽请指出,我接受大家的批评。。。。

如何用VB6.0制作Windows资源管理器

用1个lisview 1个TREEVIEW 1个IMAGELIST 就可以了,TREEVIEW是显示树形结构的,IMAGELIST是存图标的,LISTVIEW可以有4种图标显示方法,可以做出资源管理器的效果,
listview用法:
通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。ListView控件是由ColumnHeader和ListItem对象所组成的,其中ColumnHeader对象的个数决定了控件的列数,而ListItem对象的个数则决定了控件的行数。(图7)
ColumnHeader对象是ListView控件中包含标头文字的项目。利用ColumnHeader对象,用户可以:
▲单击对象触发ColumnClick事件并根据数据项目将项目排序。
▲拖动对象的右边框来调整列宽度。
▲在报表视图中隐藏ColumnHeader对象。
ColumnHeader对象的数目决定每个ListItem对象可包含的子项目数目。删除ColumnHeader对象后所有与列关联的子项目也将被删除,并且每个ListItem对象的子项目数组将平移以更新ColumnHeader的索引,而这将导致剩余的列标头SubItemIndex属性的改变。
ColumnHeader对象的SubItemIndex属性
该属性返回与ListView控件中ColumnHeader对象关联的子项目的索引。子项目是字符串数组,代表显示在报表视图中的ListItem对象的数据。第一列的列标头SubItemIndex属性设置为0,这是因为小图标和ListItem对象的文字总出现在第一列中,而且它们被当作ListItem对象而不是子项目。列标头数目取决于子项目数目。列标头数目总是比子项目数目多1。
在设计时可以利用属性页的“列首”选项卡将ColumnHeader对象添加到ListView控件中,在运行时则用Add方法添加。
ColumnHeader对象的Add方法
该方法的使用与前面那些控件基本相似,就不再介绍了。
ListView1.ColumnHeader.Add(index,key,text,width,alignment)
ListItem对象是指控件中的一行(不包含标头行)的所有内容。它也可包含文本和图片,但是要使用图片则必须通过Icons和SmallIcons属性引用ImageList控件。
ListItem对象的SubItems属性
返回或设置一个字符串(子项目)数组,它代表ListView控件中ListItem对象的数据。
ListItem对象可包含任意多个的关联项目数据字符串(子项目),但每个ListItem对象子项目数目必须相同。每个子项目都对应于相关的列标头,无法直接向子项目数组添加元素,只有通过ColumnHeaders的Add方法添加列标头的方法来添加子项目。
ListItem对象的Add方法
该方法添加ListItem对象到ListView控件的ListItems集合中并返回对新创建对象的引用。
它的语法如下:
ListItem1.Add(index,key,text,icon,smallIcon)
ListView控件的View属性
ListView控件可使用四种不同视图显示项目,这可以用View属性来确定。该属性返回或设置ListView控件中ListItem对象的外观。
ListView控件的SortOrder,SortKey和Sorted属性
控件中的ListItem对象可以按要求进行排序,与排序有关的属性是SortOrder,Sorted和SortKey属性。
SortOrder属性返回或设置一个值,此值决定ListView控件中的ListItem对象以升序或降序排序。
SortKey属性返回或设置一个值,此值决定ListView控件中的ListItem对象如何排序。
Sorted属性返回或设置确定ListView控件中的ListItem对象是否排序的值。
下面的代码说明了如何创建ColumnHeaders和ListItem对象,SubItemIndex和SubItem属性的使用方法以及如何排序。
Private Sub Form_load()
'确保ListView控件的view属性为报表视图。
ListView1.View=lvwReport
'添加三列。
ListView1.ColumnHeaders.Add,"Name","姓名"
ListView1.ColumnHeaders.Add,"Sex","性别"
ListView1.ColumnHeaders.Add,"Age","年龄"
'向控件添加ListItem对象。
Dim itmX As ListItem
'添加column1的名称。
Set itmX=ListView1.ListItems.Add(1,"ZL","张力")
'使用SubItemIndex将SubItem与正确的ColumnHeader关联。使用关键字("Sex")指定正确的ColumnHeader。
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
'使用ColumnHeader关键字将SubItems字符串与
'正确的ColumnHeader关联。
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="19"
Set itmX=ListView1.ListItems.Add(1,"LF","李芳")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="22"
Set itmX=ListView1.ListItems.Add(1,"WW","王伟")
itmX.SubItems(ListView1.ColumnHeaders("Sex").SubItemIndex)="男"
itmX.SubItems(ListView1.ColumnHeaders("Age").SubItemIndex)="24"
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ComctlLib.ColumnHeader)
Select Case ColumnHeader.Key
Case "Sex":ListView1.SortKey=1
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
Case "Age":ListView1.SortKey=2
ListView1.SortOrder=lvwAscending
ListView1.Sorted=True
End Select
End Sub
七、带刻度滑块---Slider
Slider控件是一个包含滑块和可选择性刻度标记的窗口,可以通过拖动滑块,用鼠标单击滑块的任意一侧或者使用键盘移动滑块来选择一个值。
在选择离散数值或某个范围内的一组连续数值时,Slider控件十分有用。例如,无需键入数字,通过将滑块移动到刻度标记处,可以用Slider控件来输入数值。
Silder控件的大多数基本属性比较简单,我们这里重点介绍一些较有用而又常易忽略的属性。
TickStyle属性
该属性返回或设置Slider控件上显示的刻度标记的样式。
SelectRange,SelStart和SelLength属性
Slider控件可以选择某个范围内的数值,这就要用到SelectRange,SelStart和SelLength属性。
SelectRange属性决定Slider控件是否可以选择一个范围。如果SelectRange属性为True,SelStart为选定范围的起始值,SelLength为选定范围的长度。
如果SelectRange属性为False,则SelStart属性的设置值与&#118alue属性的设置值相同,SelLength属性无效。
下列代码允许在按住SHIFT键时,用鼠标拖动或单击Slider控件以选择一个范围。
Private Sub Form_Load()
'设置slider控件的设置值
Slider1.Max=20
End Sub
Private Sub Slider1_MouseDown(Button As Integer,Shift As Integer,x As Single,y As Single)
If Shift=1 Then '如果按住Shift键,则Slider1.SelectRange=True '打开SelectRange。
Slider1.SelStart=Slider1.&#118alue'设置SelStart数值
Slider1.SelLength=0'设置先前的SelLength(如存在)为0。
End If
End Sub
Private Sub Slider1_MouseUp(Button As Integer,Shift As Integer,x As Single,y As Single)
if Shift=1 Then
'如果在一点决定返回上一步,将发生错误。
On Error Resume Next
'否则使用SelStart和当前数值设置SelLength。
Slider1.SelLength=Slider1.&#118alue-Slider1.SelStart
Else
Slider1.SelectRange=False'如果松开SHIFT键。
End If
End Sub
在程序中,常用Slider控件来代替键盘输入数字,如下面的例子。
该例通过Slider控件来显示不同的长度。
Private Sub Form_Load()
Slider1.Min=0
Slider1.Max=50
Slider1.SmallChange=1
Slider1.LargeChange=10
Slider1.TickFrequency=5
End Sub
Private Sub Slider1_Change()
Label1.Caption="长度是"Format(Slider1.&#118alue/5,"#.00")"厘米"
End Sub
==================
一、ListView使用简介
ListView控件是VB开发者非常喜爱的控件之一。作 为Windows95公共控件组(COMCTL32.OCX)的成员,它经常与经常与TreeView、ImageList等控 件联合使用。即用TreeView显示一个的树型结构,而用ListView显示选中的节点(Node)对 象的记录集。
这是笔者在开发财务软件项目中的<<凭证管理 模块的一个用户界面。屏幕左边是一个TreeView控件,用来显示会计凭证的类别;右边是一 个ListView,用来显示对应类别的凭证目录;上方是一个菜单条控件(MenuBar)和一个工具 条控件(ToolBar);下方是一个状态栏控件(StatusBar),用来显示凭证数个当前日期。
大家可以看到图中所示的界面非常类似于Window95/98 的资源浏览器,Windows的界面风格做为一种标准已为广大用户所接受。而Windows操作系 统的主要的优点就是为所有的应用程序提供了公用的界面。知道如何使用基于Windows的 应用程序的用户,很容易学会使用其他应用程序。
这种使用Windows95公共控件组合的方法能够达 到与Windows界面的一致性,所以在目前VB5.0应用程序的开发中经常使用。
二、填充大量结果集所遇到的问题
在实际应用开发中,经常用ListView填充一个数据库 结果集(Record set)的内容。即先写一段SQL查询语句,产生一个结果集,然后将结果集的每一 条记录用DO...LOOP循环语句中填到ListView中。
但是当结果集很大时(例如有5000条以上的记录) ,填充所需要的时间会很长。用户不得不等很长时间完成一个查询。所以在查询的过程中 必须允许用户按Escape键退出。具体做法是在DO...LOOP循环体中加一条DoEvents函数,并 写一段中断退出程序代码。
DoEvents函数的功能是:转让控制权,以便让操 作系统处理其它的事件。这样在长时间的查询过程中,如果用户按了Escape键,将退出循环 体,结束查询过程。
但是这样又会引发另外一个问题:由于DoEvents 可以让操作系统响应别的事件,循环体中填充每一条ListView项目(ListItem)的过程也会 显示出来,所以在填充的过程中屏幕会不停的闪动,这种现象当然不能被用户所接受。如何 解决这个问题呢?
三、解决方案
用WindowsAPI函数可以解决这个问题。首先对几个 用到的API函数做一解释和说明。
1.GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
此函数的功能是获得一个指定对象窗口(Window) 的矩型框区域(rectangle)。
Hwnd为指定对象或窗体的句柄。LpRect为返回矩 型框的结构(必须定义为结构类型的变量)。
2.ValidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
此函数的功能是使指定的矩型区域生效。这样会 通知Windows不必对指定的区域进行重画(Redraw)。
3.InvalidateRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
此函数的功能是使指定的矩型区域无效。这样会 通知Windows要对指定的区域进行重画。
具体实现的步骤如下:
1.在填充结果集之前先用GetClientRect函数获 得ListView的显示区域。
2.在增加完一个显示项目(ListItem)后用ValidateRect 函数置这一区域为有效。这样Windows就不会显示每一条ListItem,屏幕闪动的现象就会消 失。
3.在填充结果集之后,用InvalidateRect函数置 这一区域为无效。这样Windows就会重画ListView的内容,结果集被完整的显示出来。
下面是笔者在项目开发中的一个程序实例。程序 名为FillListView。该程序将填写一个Access数据库(FISCAL.MDB)的凭证表(Table)的内 容到ListView中。
首先进入VB5.0,新建一个窗体(Form),名为Form1。
然后在Form中增加下列控件。
控 件 名 Name
ListView Lvw
Imagelist imlList
Command Button。 Command1
将ImageList控件中充填一个名为“item”的图象后 与ListView控件关联。
在<<工程菜单命令条中进入“引用”对话框,选 择“MicrosoftDAOObjectLibrary”
在Form的通用模块(Modle)中定义以下变量。
Private Type RECT ' 用 来 定 义 一 个 区 域 的 坐 标。
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
' - -
' Windows API 函 数 的 声 明。
Private Declare Function InvalidateRect Lib "user32"
(ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
Private Declare Function ValidateRect Lib "user32"
(ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32"
(ByVal hwnd As Long, lpRect As RECT) As Long
Dim mbSearchCancel As Boolean
' 用 来 定 义 查 询 中 断 的 标 志。
' True 表 示 中 止 查 询;False 表 示 正 在 查 询。
将 该Form 的KeyPreview 属 性 设 为True, 以 控 制 窗 体 接 收 键 盘 事 件。
然 后 在Form 的KeyPress 事 件 中 写 下 列 代 码:
If KeyAscii = vbKeyEscape Then
mbSearchCancel = True
' 当 用 户 按Escape 键 时, 置mbSearchCancel 变 量 为True。
End If
' 表 示 结 束 查 询。
在Command Button 的 Click 事 件 中 调 用 填 充 子 程 序:Call FillListView。
子 程 序 的 代 码 为:
Private Sub FillListView()
'
Dim itmX As ListItem ' 定 义 一 个ListView 的 显 示 项 目。
Dim sSQL As String ' 查 询 字 串 变 量 。
'
Dim rc As RECT ' ListView 的 显 示 区 域。
Dim wrkJet As Workspace ' 数 据 库 工 作 空 间。
Dim dbFISCAL As Database ' 数 据 库 对 象。
Dim RS As Recordset ' 数 据 结 果 集。
On Error GoTo ErrFillListView
Screen.MousePointer = vbHourglass
lvw.ListItems.Clear: ' 清 除ListView 的 内 容。
'
' 定 义ListView 的 列 头 的 名 称。
With lvw.ColumnHeaders
.Add , , " 凭 证 编 号", 800
.Add , , " 凭 证 日 期", 1000
.Add , , " 凭 证 字 号", 1000
.Add , , " 凭 证 类 别", 800
.Add , , " 首 行 摘 要", 1440
.Add , , " 借 方 金 额 合 计", 1000, lvwColumnRight
End With
' - - -
' 产 生 查 询 语 句。
sSQL = "select voucher_id,voucher_number,voucher_date,voucher_type_shortname,"
sSQL=sSQL"voucher_type_name,voucher_memo,voucher_amount from VOUCHER"
sSQL = sSQL "order by voucher_number"
' ' - - -
' 打 开 一 个 数 据 库 结 果 集。
Set wrkJet = CreateWorkspace("NewJetWorkspace", "admin", "", dbUseJet)
Set dbFISCAL = wrkJet.OpenDatabase("FISCAL.mdb")
Set RS=. dbFISCAL .Open sSQL,dbOpenForwardOnly
'
' 获 得listview 的 显 示 区 域。
Call GetClientRect(lvw.hwnd, rc)
Do While Not RS.EOF()
DoEvents
If mbSearchCancel Then
' 中 断 退 出
RS.Close: Set RS = Nothing ' 关 闭、 清 除 结 果 集。
mbSearchCancel = False
Screen.MousePointer = vbDefault
' - -
' 刷 新ListView 的 内 容, 显 示 已 经 查 出 的 记 录 数。
Call InvalidateRect(lvw.hwnd, rc, True)
Exit Sub
End If
' - - -
' 增 加 一 个 显 示 项 目ListItem。
With lvw.ListItems
Set itmX = .Add(, , "" RS!voucher_number, "item", "item")
' 凭 证 编 号
itmX.SubItems(1) = Format$("" RS!voucher_date, "yyyy/mm/dd")
' 凭 证 日 期
itmX.SubItems(2) = "" RS!voucher_type_shortname "-" —
' 凭 证 字 号
"" RS!voucher_number
itmX.SubItems(3)="" RS!voucher_type_name
' 凭 证 类 别
itmX.SubItems(4)=""RS!voucher_memo
' 首 行 摘 要
itmX.SubItems(5)= Format$("" RS!voucher_amount, "#,###.00")
' 借 方 合 计 金 额
itmX.Tag = "" RS!voucher_id
End With
' - -
' 避 免 显 示 区 域 的 闪 动 现 象。
Call ValidateRect(lvw.hwnd, rc)
RS.MoveNext
Loop
'
'- 刷 新ListView 的 内 容。 显 示 所 有 查 出 的 记 录 数。
Call InvalidateRect(lvw.hwnd, rc, True)
' -
' 关 闭、 清 除 结 果 集。
RS.Close: Set RS = Nothing
creen.MousePointer = vbDefault
Exit Sub
ErrFillListView:
Screen.MousePointer = vbDefault
MsgBox Err ":" Error, vbInformation, Me.Caption
Exit Sub
End Sub
listview 是VB中经常用到的控件。下面说一下其使用。代码如下:
ListView1.ColumnHeaders.Add , "name", "Name", 2000 '定义列头
ListView1.ColumnHeaders.Add , "age", "Age", 1000
ListView1.ColumnHeaders.Add , "position", "Position", 3000
ListView1.ColumnHeaders.Add , "addr", "Home addr", 5000
ListView1.ColumnHeaders.Add , "other", "Other", 3000

Set itmX = ListView1.ListItems.Add(, "a", "abcd") '添加一列并设置对象itmX为listitem.
itmX.SubItems(1) = "32" '在单元格里添加内容.
itmX.SubItems(2) = "32"
双击事件
Private Sub ListView1_DblClick()
If Me.ListView1.SelectedItem Is Nothing Then
Exit Sub
End If
Dim Item As ListItem
Set Item = Me.ListView1.SelectedItem
MsgBox Item.Text '显示被双击的条目的text
End Sub
treeview用法:
Treeview 控件:名称 Treeview1;
Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32),建立索引1、2、3;(方法:在Imagelist 控件上单击鼠标右键选择属性)
Label 控件:名称分别为Lab(0)、Lab(1),Caption分别为“父节点:”、“子节点:”;
Textbox 控件:名称分别为Txt(0)、Txt(1),text都为“”;
commandbutton 控件:名称为系统默认,Caption分别为“添加”、“展开”、“收起”、“排序”、“删除”、“退出”;
将下列代码加入到代码框:
Option Explicit
Dim I As Integer
Dim J As Integer
Dim nodx As Node
Dim CunZai As Boolean '定义变量
Private Sub Command1_Click()
If Txt(0).Text < "" And Txt(1).Text < "" Then '不允许建立零字节的父节点和子节点
CunZai = False
J = TreeView1.Nodes.Count
For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在
If TreeView1.SelectedItem.Children 0 Then
If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True
End If
Next I
If CunZai = True Then '若存在, 则在父节点下建立子节点
Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" J,
Txt(1).Text, 3)
Else ,若不存在,则建立父节点和子节点
Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1)
Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" J,_
Txt(1).Text, 3)
End If
TreeView1.Refresh
ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!"
'系统提示
ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!"
End If
End Sub
Private Sub Command2_Click()
For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = True '展开所有节点
Next I
End Sub
Private Sub Command3_Click()
For I = 1 To TreeView1.Nodes.Count
TreeView1.Nodes(I).Expanded = False '收起所有节点
Next I
End Sub
Private Sub Command4_Click()
TreeView1.Sorted = True '排列顺序
End Sub
Private Sub Command5_Click()
If TreeView1.SelectedItem.Index < 1 Then
TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点
End If
End Sub
Private Sub Command6_Click()
End '退出程序
End Sub
Private Sub Form_Load()
TreeView1.LineStyle =TvwTreeLines '在兄弟节点和父节点之间显示线
TreeView1.ImageList = ImageList1 '链接图像列
TreeView1.Style = tvwTreelinesPlusMinusPictureText
'树状外观包含全部元素
Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1)
'建立名称为"蒲子明"的父节点,选择索引为1的图像
Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3)
'在"蒲子明"父节点下建立"收件箱"子节点,选择索引为3的图像
Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "发件箱", 3)
'在"蒲子明"父节点下建立"发件箱"子节点,选择索引为3的图像
CunZai = False
End Sub
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
Node.ExpandedImage = 2 '节点被展开时,选择索引为2的图像
End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0为无
For I = 1 To TreeView1.Nodes.Count
If TreeView1.Nodes(I).Selected Then
MsgBox "您选择的是:“" TreeView1.Nodes(I).FullPath "”子节点!"
'系统提示
End If
Next I
End If
告诉你用法你得自己写代码才有编程的乐趣不是吗???

易语言 HOOK API 教程 要详细的说明

#include#include "APIHook.h" extern CAPIHook g_OpenProcess; // 自定义OpenProcess函数 #pragma data_seg("YCIShared") HHOOK g_hHook = NULL; DWORD dwCurrentProcessId=0; #pragma data_seg() HANDLE WINAPI Hook_OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId) { typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(DWORD, BOOL,DWORD); if(dwProcessId != dwCurrentProcessId) { return ((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId); } return 0; } // 挂钩OpenProcess函数 CAPIHook g_OpenProcess("kernel32.dll", "OpenProcess", (PROC)Hook_OpenProcess); ////static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam); } BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { BOOL bOk; dwCurrentProcessId=dwThreadId; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), 0); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; } API 通过HOOK OpenProcess() 实现进程防杀2007-07-04 14:41在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗? 设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而又不能被使用者通过“结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:1.屏蔽“CTRL+ALT+DEL”这个热键的组合;2.让程序不出现在任务管理器的列表之中;3.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWS 9X下可以很轻易地使用注册服务进程的方法实现,但是对于WINDOWS NT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate网址过滤器 就是采用的这种方式防杀的,接下来我就来介绍这种方法。 任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的Win32 API函数,我们来看看它的定义: BOOL TerminateProcess( HANDLE hProcess; // 将被结束进程的句柄 UINT uExitCode; // 指定进程的退出码 ); 看到这里,是不是觉得不必往下看都知道接下来要做什么:Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数: HANDLE OpenProcess( DWORD dwDesiredAccess, // 希望获得的访问权限 BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承 DWORD dwProcessId // 要访问的进程ID ); 脉络渐渐显现:在调用TerminateProcess()之前,必先调用OpenProcess(),而OpenProcess()的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要Hook的函数不是TerminateProcess()而是OpenProcess(),在每次调用OpenProcess()的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 至此,疑团全部揭开了。由Hook TerminateProcess()到Hook OpenProcess()的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了OpenProcess()上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。参考资料: http://hi.baidu.com/wlw7758/blog/item/9d109322816032f1d7cae2d7.html版权所有,谢绝抄袭!!!!!! 关于自制api进程管理器和自制api进程管理器怎么用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 自制api进程管理器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于自制api进程管理器怎么用、自制api进程管理器的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口测试单元测试用例(接口测试用例编写要点)
下一篇:Java中由substring方法引发的内存泄漏详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~