VB用windows API激活子窗体

http://files.cnblogs.com/files/liuzhaoyzz/%E6%BF%80%E6%B4%BB%E5%AD%90%E7%AA%97%E4%BD%93.rar
setforegroundwindow只能激活桌面级的父窗体,即使后面跟的hwnd是子窗体的hwnd也不行!
激活子窗体,可以先用setforegroundwindow把父窗体带到前台,然后用以下消息激活子窗体:
'Private Const WM_MOUSEACTIVATE=&H21
SendMessage thwnd, WM_MOUSEACTIVATE, 0, 0
'Private Const WM_LBUTTONDOWN = &H201
SendMessage tHwnd, WM_LBUTTONDOWN, 0, 0
或者直接用SendMessage thwnd, 33, 0, 0来激活子窗体。
在form1下面新建3个command按钮,然后打开excel,新建book1,book2,把焦点切换到book1,然后测试以下代码,会把焦点切换到book2:
'form1的代码:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_LBUTTONDOWN = &H201
Private Sub Command1_Click()
' Call SetNumLock(False) '关闭NumLock键
' CALL MySendKey (vbKeyCapital)
' MsgBox GetAsyncKeyState(vbKeyCapital)
If GetKeyState(vbKeyCapital) = 1 Then '如果CAPSLOCK被按下
SendKeys "{CAPSLOCK}", False
' Call MySendKey(vbKeyCapital)
' ScanCode = MapVirtualKey(vbKeyCapital, 0)
' Call keybd_event(vbKeyCapital, ScanCode, 0, 0)
' Sleep 1000
' Call keybd_event(vbKeyCapital, ScanCode, KEYEVENTF_KEYUP, 0)
' Sleep 1000
End If
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("XLMAIN", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "XLDESK", vbNullString)
If tHwnd > 0 Then
tHwnd = FindWindowEx(tHwnd, ByVal 0&, vbNullString, "Book2")
End If
End If
If tHwnd = 0 Then
MsgBox "请先新建两个空白excel,名字叫做book1,book2"
Exit Sub
End If
SetForegroundWindow dHwnd '激活父窗体
Sleep 1000 '等待窗口切换
'Private Const WM_MOUSEACTIVATE = &H21
' SendMessage tHwnd, WM_MOUSEACTIVATE, 0, 0
' Private Const WM_LBUTTONDOWN = &H201
SendMessage tHwnd, WM_LBUTTONDOWN, 0, 0
' Private Const WM_PARENTNOTIFY = &H210
' Private Const WM_ACTIVATE = &H6
' SendMessage hwnd4, WM_ACTIVATE, 0, 0
' Private Const WM_LBUTTONDOWN = &H201
' SendMessage hwnd4, WM_LBUTTONDOWN, 0, 0
Sleep 1000 '等待窗口切换
' SendKeys "{CAPSLOCK}", FALSE
Sleep 1000
SendKeys "{enter}"
SendKeys "AAA", False
SendKeys "bbb", False
SendKeys "CCC", False
SendKeys "ddd", False
SendKeys "EEE", False
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Command3_Click()
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd '激活父窗体
MySendKey vbKeyA
End Sub
VB用windows API激活子窗体的更多相关文章
- c#让窗体永在最前 调用windows api 将窗体设为topmost
有时候应用程序需要将一个窗体始终位于屏幕的最前面,即使切换到其它窗体也能看到该窗体,这样的窗体就叫做TopMost窗体. 用C#制作TopMost窗体之前,首先要了解如何声明SetWindowPos函 ...
- Windows API 查找窗体,发送Windows消息
最近项目中需要做Windows消息截获操作,在网上找了一些资料. public class WindowsAPI { /// <summary> /// 回调函数代理 /// </s ...
- c# 判断窗体是否永在最前(TopMost),调用windows API
许多程序都可以把自身的窗体设为最前显示状态,这个可以参考博客c#让窗体永在最前 调用windows api 将窗体设为topmost.那么如何判断桌面上的一个窗体是否为最前显示状态呢,不光是自己的程序 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- Windows API Finishing
input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- [windows菜鸟]Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- Windows API Hooking in Python
catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
随机推荐
- 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)
Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...
- 使用C#创建快捷方式
在Windows中创建快捷方式很简单,直接用右键点击文件或文件夹,选择创建快捷方式即可.如果想用C#代码的方式创建,就没有那么方便了,因为.NET框架没有提供直接创建快捷方式的方法. 首先我们看一下快 ...
- centOs安装jdk1.7
1,下载jdk-7u75-linux-x64.tar.gz,地址http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloa ...
- bootstraptable插件文档的坑
1.事件onCheck中文档参数为row, $element正确的顺序为$element,row eg: $Table.on('check.bs.table', function ($element, ...
- Com
- String空值判定
不能用 str.equalsIgnoreCase(null). 写了个判定的方法,供以后直接调用: public static boolean isEmpty(String str) { if (st ...
- DOM的基本属性
结构和内容属性1.1 nodeType1.2 nodeName, tagName1.3 innerHTML1.4 innerHTML pitFalls1.5 nodeValue 总结DOM节点是一个对 ...
- 笔记--MySQL相关操作
一 登录数据库 1 用户无密码: mysql -uroot -p mysql-> 2 用户有密码: MySQL -root -p[passwd] mysql-> 二 创建数据库: 查询 ...
- 压测session优化
每请求一次jsp页面,会产生一个session对象,并且这个对象30分钟后才过期.我们计算了下当时的QPS是5000,也就是说每秒钟产生5000个session对象.每分钟产生300K个对象,sess ...
- angular学习之关于ng-class详解
1,定义和用法 ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng-class 指令的值可以是字符串,对象,或一个数组. 如果是字符串,多个类名使用空格分隔. 如果是对 ...