怎么用VB获取窗口句柄和移动窗口坐标?
vb吧
全部回复
仅看楼主
level 1
sx371082 楼主
我想要实现的功能是把某窗口一键自动移动到屏幕指定坐标,不知道用VB怎么实现?
2016年03月28日 02点03分 1
level 11
完全可以实现
2016年03月29日 03点03分 2
怎么弄?
2016年03月29日 07点03分
level 7
setwindowpos
2016年03月29日 05点03分 3
level 1
Private Sub Command1_Click()
EnumWindows AddressOf EnumWindowsProc, 0 '枚举窗口
End Sub
'以下代码为添加至模块的代码
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT) As Long
Public Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const WM_GETTEXT As Long = &HD
Public Const HWND_TOP As Long = 0
Public Const SWP_SHOWWINDOW As Long = &H40
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long '枚举窗口的回调函数
Dim byteBuf(1 To 1024) As Byte
Dim strTxt1 As String
SendMessage hwnd, WM_GETTEXT, 1024, byteBuf(1)
strTxt1 = StrConv(byteBuf, vbUnicode)
strTxt1 = Left(strTxt1, InStr(strTxt1, Chr(0)) - 1)
Dim r As RECT
GetWindowRect hwnd, r
If 0 = StrComp(strTxt1, "文件A.TXT - 记事本", vbTextCompare) Then
SetWindowPos hwnd, HWND_TOP, 0, 0, r.Right - r.Left, r.Bottom - r.Top, SWP_SHOWWINDOW
End If
If 0 = StrComp(strTxt1, "文件b.txt - 记事本", vbTextCompare) Then
SetWindowPos hwnd, HWND_TOP, 0, 100, r.Right - r.Left, r.Bottom - r.Top, SWP_SHOWWINDOW
End If
EnumWindowsProc = -1
End Function
2016年03月29日 11点03分 4
运行后 VB崩溃了怎么回事?
2016年03月29日 14点03分
level 13
抽了点时间 将获取RECT结构体区间尺寸的代码给你
Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Dim Rec As RECT '定义Rec为结构体对象
'*********************************************** 本行上面的代码是获取 RECT区间用到的API与结构体
'获取句柄用到的API
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'移动句柄窗口对象用到的API
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
'设定句柄窗口对象位置大小用到的API
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Dim HwndVal&, W&, H&, X1&, Y1& '变量声明与定义
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体居中
Shell "cmd /c calc.exe", vbHide
End Sub
Private Sub Form_Unload(Cancel As Integer)
Shell "taskkill.exe /im calc.exe /f", vbHide
Set Form1 = Nothing
End
End Sub
Private Sub Command1_Click()
HwndVal = FindWindow(vbNullString, "计算器") '获取计算器的句柄
GetWindowRect HwndVal, Rec '使用REC结构体 获取指定句柄窗口区间的上下左右四个坐标点
W = Rec.Right - Rec.Left '计算宽度赋值给变量W
H = Rec.Bottom - Rec.Top '计算高度赋值给变量H
X1 = 0: Y1 = 0 '坐标值X1 Y1 可以自行改变 以像素为单位 vb的 Twip值要除以15
MoveWindow HwndVal, X1, Y1, W, H, 1 '使用API MoveWindow移动窗口到X1 Y1 坐标位置
SetWindowPos HwndVal, -1, 0, 0, 0, 0, 3 '让指定的句柄窗口置顶
End Sub
2016年03月29日 17点03分 6
level 1
cbm666 老师居然还活跃在VB6中啊,额滴神啊,神啊,啊。。。。
2016年03月30日 02点03分 7
开发新项目转型为C++ 但是接单我还是用VB6 因为开发快速 做过的模块一大堆直接调用改改就行 多省心
2016年03月30日 03点03分
@cbm666 CBM666老师厉害啊,2005年我还在上大二,当时就会写上万的代码了(某一风水软件,VB6+ACCESS)开发的,自认为很厉害了,2006年左右拜读了很多CBM666的经验贴,很多地方((((百度贴吧,百度空间(最多),百度知道(别人复制你的代码)老师的QQ群)))。
2016年04月25日 08点04分
@cbm666 在2008年的时候,我把你的整个百度空间里的资料(估计有300~500篇【(全都是亲测有效文章)】)都整理进了我的TXT管理小工具中。在此过程中,我也喜欢上用txt,而不是vbp工程文件,2008~2010应该是我VB6技术第二次爆发期,让我有技术到瓶颈的感觉。其中CBM666的影响占3成以上的贡献。
2016年04月25日 08点04分
@cbm666 影响蛮大的,,再次感谢CBM666老师。CBM666属于真正技术牛人。[真棒]
2016年04月25日 08点04分
level 7
Private Sub Command1_Click()
Dim w As New clsWindow
w.GetWindowByTitle("计算器").Move 100, 100
End Sub
关于clsWindow可以到gitee.com/sysdzw/clswindow下载下面这两个文件添加到自己工程中:
clsWindow.cls
modWindow.bas
2022年09月08日 12点09分 8
1