vb.net下可以用API函数的吧,我想问一个findwindow的问题

magicbacon 2007-01-22 08:41:24
以下是代码,很久以前在VB6.0下用过,现在用vb2005。希望能找到Maxthon浏览器的句柄,然后控制窗口的最小化、最大化(这部分代码还没加)。
Public Class Form1

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Const GW_HWNDNEXT = &H1
Private Sub btnWatermark_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWatermark.Click
Dim handle As Long
Dim strTitle As String
Dim intLen As Long
handle = GetWindow(Me.Handle, GW_HWNDNEXT) '出错
Do While handle
handle = GetWindow(handle, GW_HWNDNEXT)
intLen = GetWindowTextLength(handle)
GetWindowText(handle, strTitle, intLen + 1)
If (Microsoft.VisualBasic.Left(strTitle, 9) = "[Maxthon]") Then
Exit Do
End If
Loop
RichTextBox1.Text &= strTitle
End Sub

End Class

当运行到注释“出错”处时出现以下问题:
PInvokeStackImbalance was detected

A call to PInvoke function 'Tester!Tester.Form1::GetWindow' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

侦测到调用堆栈失衡
对函数GetWindow的调用使堆栈失衡。原因可能是"managed PInvoke signature"与"unmanaged target signature"不匹配。确认"PInvoke signature"的调用规则和参数与目标"unmanaged signature"匹配。

不知具体是什么意思?高手能不能从中找到解决办法?我取消了对这个错误的侦测后,GetWindow也无法得到正确的句柄。怎么回事呢?
...全文
581 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicbacon 2007-01-23
  • 打赏
  • 举报
回复
解决,50分够各位瓜分么?
snowfox007 2007-01-23
  • 打赏
  • 举报
回复
注意获得Text的函数中的接收String,在使用 GetWindowText之前先使用Space函数填充.

下面的程序已经通过验证.

Private Sub btnWatermark_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWatermark.Click
Dim handle As Integer
Dim strTitle As String
Dim intLen As Integer
handle = GetWindow(Me.Handle, GW_HWNDNEXT)
Do While handle
handle = GetWindow(handle, GW_HWNDNEXT)
intLen = GetWindowTextLength(handle)
strTitle = Space(intLen) '用空格填充
GetWindowText(handle, strTitle, intLen + 1)

Debug.Print(strTitle)
Loop

End Sub
snowfox007 2007-01-23
  • 打赏
  • 举报
回复
这是部分相关的常数定义:

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const GW_HWNDPREV = 3

VB中的声明中的所有的Long应该改为Integer或者Int32,因为VB中的Long的大小为4字节,VB.net中的Integer才为4字节.
snowfox007 2007-01-23
  • 打赏
  • 举报
回复
老兄,你定义的常数错了!!!
Private Const GW_HWNDNEXT = &H1

应该为
Private Const GW_HWNDNEXT = &H2

兔子-顾问 2007-01-23
  • 打赏
  • 举报
回复
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Integer, ByVal lpString As String, ByVal cch As Integer) As Integer
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Integer) As Integer
Public Declare Function GetWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
magicbacon 2007-01-23
  • 打赏
  • 举报
回复
改为Int32到出错处时会溢出,所以说GetWindow无法取到正确的句柄,改成Int64可以运行,但在循环过程中handle的值不发生变化,与Long一样.
Anyway,谢谢楼上大哥!
sx_lxh 2007-01-22
  • 打赏
  • 举报
回复
将long全改为int32 试试。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧