求一段代码,【窗体无焦点置顶】的代码

eaqpi 2011-05-16 11:51:27
求 窗体无焦点置顶的 方法,VS2010

A窗体按键弹出B窗体。B窗体置顶,A窗体依旧可以操作,B窗体不获得焦点。点击B窗体,B窗体响应,但焦点依旧交还给A窗体。

例如:A窗体上有text框,我在text框中输入文字,B窗体根据text的文字变化而出现不同的选择项,当点击b窗体的选项,A窗体的文字框文字显示B窗体的选择项。单A窗体的text框不丢焦点。(只是说明作用,不用那么多代码)

求 能实现以上例子的 窗体无焦点置顶的方式.
...全文
182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
eaqpi 2011-05-17
  • 打赏
  • 举报
回复
有没有高手帮忙啊。。
eaqpi 2011-05-16
  • 打赏
  • 举报
回复
需要无焦点,在操作的时候也是 前一个窗体不丢焦点。
gxingmin 2011-05-16
  • 打赏
  • 举报
回复
如果想置顶的窗体显示后无焦点,需要加上这句
me.Activate()


dim frm as new Form2()
frm.TopMost = true '加上这句,置顶的
frm.Show()
me.Activate()
gxingmin 2011-05-16
  • 打赏
  • 举报
回复
 dim frm as new Form2()
frm.TopMost = true '加上这句,置顶的
frm.Show()
eaqpi 2011-05-16
  • 打赏
  • 举报
回复
修正form2代码

Imports System.Runtime.InteropServices
Public Class Form2
Dim hWnd As IntPtr
Const GWL_EXSTYLE As Integer = -20
Const WS_EX_NOACTIVATE As Int32 = 134217728 '0x08000000
Const WS_EX_APPWINDOW As Int32 = 134217729 '0x08000001

<DllImport("User32.dll", EnTryPoint:="SetWindowLong")> _
Public Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Int32) As Int32
End Function

<DllImport("User32.dll", EnTryPoint:="GetWindowLong")> _
Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Int32
End Function


<DllImport("USER32.DLL")> _
Public Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Boolean
End Function

Public Sub New(ByVal hWnd As IntPtr)
Me.hWnd = hWnd
InitializeComponent()
End Sub


Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SetWindowLong(Me.Handle, GWL_EXSTYLE, GetWindowLong(Me.Handle, GWL_EXSTYLE) + WS_EX_NOACTIVATE)
SetForegroundWindow(Me.hWnd)
End Sub
'2个按钮,1、退出 2、送键值 A
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SendKeys.Send("A")
End Sub
End Class
threenewbee 2011-05-16
  • 打赏
  • 举报
回复
这么简单的问题。

在主窗口里这样打开子窗口:

Dim child As New ChildForm()
child.Show(Me)
eaqpi 2011-05-16
  • 打赏
  • 举报
回复
建立2个窗体,
A、1、放一个按键(button) 2、放一个文本框。
B、放2个按键(button)

form1中拷贝入代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim fm As New Form2(Me.Handle)
fm.TopMost = True
fm.Show()
End Sub


form2中拷贝入代码
Imports System.Runtime.InteropServices
Public Class Form2
Dim hWnd As IntPtr
Const GWL_EXSTYLE As Integer = -20
Const WS_EX_NOACTIVATE As Int32 = 134217728 '0x08000000
Const WS_EX_APPWINDOW As Int32 = 134217729 '0x08000001

<DllImport("User32.dll", EnTryPoint:="SetWindowLong")> _
Public Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Int32) As Int32
End Function

<DllImport("User32.dll", EnTryPoint:="GetWindowLong")> _
Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Int32
End Function


<DllImport("USER32.DLL")> _
Public Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Boolean
End Function

Public Sub New(ByVal hWnd As IntPtr)
Me.hWnd = hWnd
InitializeComponent()
End Sub


Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SetWindowLong(Me.Handle, GWL_EXSTYLE, GetWindowLong(Me.Handle, GWL_EXSTYLE) + WS_EX_NOACTIVATE)
SetForegroundWindow(Me.hWnd)
End Sub
'2个按钮,1、退出 2、送键值 A
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Me.Close()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
SendKeys.Send("A")
End Sub
End Class


运行

发现一个问题,如果是外面的窗体,比如打开一个记事本等,可以完美的运行无焦点状态,点击button2送出键值A。
但是如果是创建他的 form1则不行,总是会让form2 获得焦点,为什么呢?求教。

16,555

社区成员

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

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