一样的API函数,为什么有的电脑运行有效,有的无效
同样的API函数,为什么有的电脑运行有效,有的无效?本帖最后由 pengwei0417 于 2013-03-16 14:04:02 编辑Dec
同样的API函数,为什么有的电脑运行有效,有的无效?
本帖最后由 pengwei0417 于 2013-03-16 14:04:02 编辑
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer '发送窗口消息
Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer '根据标题查找窗口句柄
Private Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean '强制指定句柄的窗口的外部程序获取焦点
hWnd = FindWindow(vbNullString, "Microsoft Internet Explorer")
'关闭指定句柄窗口
Const WM_CLOSE = &H10
SendMessage(hWnd, WM_CLOSE, 0, 0)
声明以上的API函数,在部分电脑运行无效,无法关闭想关闭的标题为Microsoft Internet Explorer的窗口,是怎么回事?
[解决办法]windows版本不一样?
[解决办法]是不是因为有的电脑没有安装.net的原因呢?
[解决办法]因为有的窗不叫那个,你单步跟一下就知道原因了,很有可能句柄都没有获得到
[解决办法]你在不能正常关闭的机子上用代码调试一下,或者在你的程序代码hWnd = FindWindow(vbNullString, "Microsoft Internet Explorer")后面将hWnd显示出来看一下。很可能是0,修改"Microsoft Internet Explorer",使其不为0就行了。
[解决办法]跟函数无关,你确定窗体名字是这个?
[解决办法]跟系统有关吧?
[解决办法]你应该在每台机器上先目测一下窗体标题,比如我这里就是 "空白页 - Windows Internet Explorer" 而不是 "Microsoft Internet Explorer"。
[解决办法]UAC问题???用管理员运行试试??
[解决办法]应该是目标程序的版本问题导致。因为你的程序没有对目标程序的多个版本做支持,而你的目标程序又是 IE 浏览器这种扩展性比较强的程序,甚至可以更改注册表都可以改变目标程序的相关设置。所以这是你的程序没有考虑兼容性问题而产生的漏洞。
如果你的目标程序确定是 IE 浏览器,建议采用 BHO 技术对其进行处理,要不可以用枚举对象的方法取得目标对象,这种方法会比你直接用 API 来枚举窗口并判断哪个是 IE 窗口要准确得多。
[解决办法]断点调试一下,看哪个句柄为0