会变语言实现的一些程序
源代码在线查看: 取得控制台程序的handle的2种方法 .txt
取得控制台程序的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
--------------------------------------------------------------------------------