无输入焦点窗体 拖动时卡顿,如何解决?

youryida 2011-02-26 11:42:15
【要求】
窗体无输入焦点(也就是运行时不会影响其他窗口的输入焦点);
拖动窗体时不要出现下面代码中的卡顿现象。希望能求到正确的代码,谢谢!
(生成.exe文件后,运行程序,然后打开其他窗口,再拖动窗体,就会卡)
下面是代码:
Option Explicit 
' 转移输入焦点的声明
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

' 禁止本窗体拥有输入焦点的常数
Private Const HWND_NOTOPMOST = -2
Private Const WS_DISABLED = &H8000000 Private Const GWL_EXSTYLE = (-20)
Private Const GWL_STYLE = (-16)

'禁止拥有输入焦点
Private Sub Form_Load()
SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_DISABLED Or GetWindowLong(Me.hwnd, GWL_EXSTYLE)
End Sub

...全文
164 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
youryida 2011-04-06
  • 打赏
  • 举报
回复
'只能做成无标题栏的然后利用 mouse_move事件:
Option Explicit
Private hwnd_Avtive As Long '前台窗口句柄变量
'移动窗体声明
Private Declare Function ReleaseCapture Lib "user32" () 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 Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'转换前台窗口声明
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
'窗体无焦点风格常数
Private Const WS_DISABLED = &H8000000
Private Const GWL_EXSTYLE = (-20)
'移动窗体常数
Private Const WM_SYSCOMMAND = &H112 '查下
Private Const SC_MDIMOVE = &HF012& '?网上的这个为什么是这个数SC_MOVE = &HF012; API浏览器上为什么又是这个数Public Const SC_MOVE = &HF010&?
'载入时设为无焦点
Private Sub Form_Load()
SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_DISABLED '? 为什么要用EXSTYLE
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
hwnd_Avtive = GetForegroundWindow '获取前台窗口句柄
SetForegroundWindow Me.hwnd '激活本窗体
ReleaseCapture '移动窗体(MousePointer = 0--鼠标形状缺省)
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MDIMOVE, 0
SetForegroundWindow hwnd_Avtive '重新激活前台窗口
End Sub

VB窗体拖动时没有事件可以激发,只能做成无标题栏的那种,然后自己画边框标题栏。
希望能帮到大家~
csorca 2011-03-01
  • 打赏
  • 举报
回复
mouse_down事件里头对控件的Enable属性进行设定, mouse_up过后再设置回来,再设置焦点状态,,,, 拖动的时候就不会抢了
lihaidomain 2011-03-01
  • 打赏
  • 举报
回复
晕,我的想法刚刚和你相反了。你是想不抢其他窗口的焦点。
11楼正解。
king06 2011-02-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110209/14/de04534d-905c-4a14-b4a5-8099413e4f40.html
我的还是置顶窗口
贝隆 2011-02-28
  • 打赏
  • 举报
回复
1、将窗口置顶
2、设置窗体中所有的可获得焦点的控件的Enabled属性为False
youryida 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lihaidomain 的回复:]
你将窗口设置为禁止状态,当然卡壳咯。
不知你的用在什么用途,如果是想让你的文本框拥有不死的焦点,可以通过子类来搞定。
如果想要做到好像条码枪扫描的数据时,不管你的窗口是否处于激活状态,都能将数据输入文本框里,那就可以用消息钩子,如果是WM_KEYDOWN就做个标记,接下来如果有WM_CHAR消息就不理它(是键盘输入的),是WM_KEYUP就取消标记,如果来WM_CHAR并没有WM_KEYDOW……
[/Quote]
你好!你理解我的意思了。我要做的程序就像“调出搜狗输入法→将光标点在网页回复框里→ctrl+shift+Z调出那个快捷输入窗口”-----不管怎么移动那个小窗口,网页回复框里的焦点永远不变。
我就是想要这个效果,但是我写的程序,它拖动的时候怎么卡啊?我快恶心死了,帮帮忙啦...

源文件地址:http://u.115.com/file/f4c368a043
youryida 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 king06 的回复:]
http://topic.csdn.net/u/20110209/14/de04534d-905c-4a14-b4a5-8099413e4f40.html
我的还是置顶窗口
[/Quote]

你好!我的也可以置顶哦,源程序还有功能演示我都贴上来了,希望你能下下来看一下。http://u.115.com/file/f4c368a043

然后,可不可以告诉我,怎样才能让程序窗口拖动时不会卡?谢谢啦~
youryida 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dbcontrols 的回复:]
可是文本框里面无法输入东西
另外不卡
我用VB6SP3+XP
[/Quote]

真的非常感谢,我现在迫切的想让您知道我的问题到底是什么。我要出代码了,源文件还有程序的演示都在网盘上,希望您能下下来试一下。http://u.115.com/file/f4c368a043

我只是不想让它拖动时卡,怎么这么难啊...
lihaidomain 2011-02-28
  • 打赏
  • 举报
回复
你将窗口设置为禁止状态,当然卡壳咯。
不知你的用在什么用途,如果是想让你的文本框拥有不死的焦点,可以通过子类来搞定。
如果想要做到好像条码枪扫描的数据时,不管你的窗口是否处于激活状态,都能将数据输入文本框里,那就可以用消息钩子,如果是WM_KEYDOWN就做个标记,接下来如果有WM_CHAR消息就不理它(是键盘输入的),是WM_KEYUP就取消标记,如果来WM_CHAR并没有WM_KEYDOWN标记就是扫描枪的输入消息(我猜的),就把这个消息转发到输入编辑框。子类化编辑框,然后扫描枪扫入,看看都有什么消息?如果没有256,257消息那就可以做到焦点在任何窗口都能扫到指定编辑框。
dbcontrols 2011-02-27
  • 打赏
  • 举报
回复
可是文本框里面无法输入东西
另外不卡
我用VB6SP3+XP

[Quote=引用 3 楼 doitslowly 的回复:]
引用 2 楼 dbcontrols 的回复:

我测试了一下,既有焦点又卡


哈哈,还是你好!每次问问题你都会来,谢谢了哈!

那个程序确实不会抢文本框的输入焦点:先运行程序,然后随便选择一个文本框,点上光标后,再去激活程序窗口,你会发现,文本框里的焦点确实不会被抢去了。真的!
[/Quote]
youryida 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dbcontrols 的回复:]

我测试了一下,既有焦点又卡
[/Quote]

哈哈,还是你好!每次问问题你都会来,谢谢了哈!

那个程序确实不会抢文本框的输入焦点:先运行程序,然后随便选择一个文本框,点上光标后,再去激活程序窗口,你会发现,文本框里的焦点确实不会被抢去了。真的!
dbcontrols 2011-02-27
  • 打赏
  • 举报
回复
我测试了一下,既有焦点又卡
youryida 2011-02-27
  • 打赏
  • 举报
回复
... 咋没人回复啊?

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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