会变语言实现的一些程序

源代码在线查看: 取得控制台程序的handle的2种方法 .txt

软件大小: 1703 K
上传用户: dedien
关键词: 语言 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				取得控制台程序的handle的2种方法 
				    作者:Kevin E 于2007-9-16上传   
				
				--------------------------------------------------------------------------------
				  前面介绍了如何设计一个控制台程序,很多时候我们需要取得运行程序的handle,
				通常会使用下面的API:
				
				  invoke GetModuleHandle,NULL
				
				  返回值在EAX中。但是,这种方法在控制台程序中并不好用(谁知道为什么?)
				经过笔者一番查找,找到了2种其他方法。
				
				一.通过更改窗口的标题再查找标题
				  这里使用的一个API是 invoke SetConsoleTitle,CTXT("HH") ;这样就将窗口的标题设置为了 HH(具体说明具体请参考参考2)
				
				  接下来,我们在使用FindWindow  API 函数查找标题是‘HH’的窗口的handle:
				FindWindow,NULL,CTXT("HH") ;第一个参数是class,第二个参数是窗口名。我们这里只使用窗口名,所以第一个参数设置为空(具体说明具体请参考参考3)
				
				  因此,参考1中给出的方法就是 保存当前 console 窗口的标题?更改标题?查找更改后的标题取得handle?改回原来的标题。需要注意的是,在更改标题和查找更改后的标题之间需要有一个延时,暂时不清楚是什么原因必须这样做。
				参考一给出的是C语言的程序,有兴趣的读者不妨试验一下修改为asm的。
				
				二.更简单的方法使用GetConsoleWindow API
				
				   Windows提供了一个更直接简单的API,就是GetConsoleWindow,关于它的介绍在本期前面的文章中有提到过,请参考。下面列出程序
				
				
				;#Mode=CON
				.386
				.model flat, stdcall
				option casemap :none
				
				include windows.inc
				include user32.inc
				include kernel32.inc
				include masm32.inc
				
				includelib user32.lib
				includelib kernel32.lib
				includelib masm32.lib
				include macro.asm
				
				.data?
				   buffer   db 100 dup(?)
				
				.CODE
				START:
				   invoke GetConsoleWindow
				   invoke ShowWindow,eax,SW_MINIMIZE ;这个地方用来验证取得的是否为
				;console的handle,如果取得正确
				;控制台会自动最小化
				   
				   ;暂停显示,回车键关闭
				   invoke StdIn,addr buffer,sizeof buffer
				   invoke ExitProcess,0
				end START
				
				  很多文章中提到了使用如下方法:
				
				  invoke GetStdHandle,STD_OUTPUT_HANDLE
				
				  但是经过我的实验这种方法是无法取得的,每次都是固定的值。
				
				  参考1:http://support.microsoft.com/kb/124103/zh-cn
				
				--------------------------------------------------------------------------------
											

相关资源