[问题]在全萤幕的程式上让视窗置顶

losegames 2008-02-14 12:00:56
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

Const SWP_NOMOVE = &H2 '不更动目前视窗位置
Const SWP_NOSIZE = &H1 '不更动目前视窗大小
Const HWND_TOPMOST = -1 '设定为最上层
Const HWND_NOTOPMOST = -2 '取消最上层设定
Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE

'在程式呼叫的范例如下所示:
Private Sub Command1_Click()
'将 APP 视窗设定成永远保持在最上层
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
End Sub

Private Sub Command2_Click()
'取消最上层设定
SetWindowPos Me.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS
End Sub
'--------------------------------------------------------------------------
SetWindowPos似乎在全萤幕的视窗上面没有作用
因为我再玩全萤幕的游戏时希望能同时看到某些资料
我也看过有些游戏的外挂,可以在游戏中呼叫出视窗
而不用将游戏跳到桌面,请问该怎么做呢!?
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
losegames 2008-02-19
  • 打赏
  • 举报
回复
我的问题是 使用SetParent将我的表单变成游戏的子视窗
但是视窗却只有显示一下就消失了....
即使用SetForegroundWindow取的焦点...但是游戏却会被缩小
跳到桌面去...

如果要用您的方法,请问要如何将他插入游戏的线程
再用createwindow呢?
PctGL 2008-02-18
  • 打赏
  • 举报
回复
不知道楼主的问题到底是什么样
如果简单的setparent就能设置,那就给自己的窗体不断重画好了

如果setparent 不能将窗体投射到游戏窗口,那就要用线程插入的方法,然后在远程线程中createwindow
就没问题了
嗷嗷叫的老马 2008-02-16
  • 打赏
  • 举报
回复
呃....那看看还有没有哪位朋友搞过...

帮顶顶
buzhihuigai 2008-02-16
  • 打赏
  • 举报
回复
SetParent只设置一次就可以了

重绘怎么会洗掉子窗口的内容,应该是失去焦点吧
losegames 2008-02-16
  • 打赏
  • 举报
回复
我玩的游戏似乎没有那么利害
没有取得焦点也不会让游戏退出
使用SetParent的确可以把他设定为子视窗
但是不知道是不是画面从绘的关系...
一出现马上就会被洗掉了...
我试过使用Timer每秒都使用SetParent
却只有看到视窗不断被从绘
但是却不能点他...一点他就会跳回桌面
游戏视窗就被缩小啰.....
请问有办法解决吗!? 让我的视窗不会被从绘消失
也能让我在游戏画面上对视窗进行Click
嗷嗷叫的老马 2008-02-15
  • 打赏
  • 举报
回复
LZ这种程序与外挂差不多.

以前的如老传奇之类游戏很简单,只要把自己的程序设置为游戏主窗体的子窗体就行了,使用SetParent.

但是现在的游戏一般都不是这么简单的了,它们会定时检测当前焦点的窗体是不是游戏主窗体,如果不是就设置回去.有的游戏甚至在N次以后就会自动退出.

记得有一种思路就是API拦截,一句话就是废了游戏的检测当前窗体能力,让它始终返回"是游戏的主窗体",然后再使用SetParent.

不过这需要针对游戏进行分析,并不是每个游戏都是一样的方法.

其它的思路我没有留意过,不过如果你的游戏很BT,使用VB本身的能力恐怕不行了.

至少得用到内嵌汇编啊,或者使用其它技术~~

总之祝你好运吧:)
东方之珠 2008-02-15
  • 打赏
  • 举报
回复
说明你的游戏在全屏幕时,也是置顶的,并获得焦点。这时,如果有其他窗体置顶时,当然看不到,因为没有获得焦点,最好用热键启动其他窗体置顶:SetWindowPos Me.hwnd,-1,0,0,0,0,3 或者在Timer事件中将其他窗体获得焦点即可(这个时候游戏只能看,不能操作,没有焦点)。
东方之珠 2008-02-15
  • 打赏
  • 举报
回复
说明你的游戏在全屏幕时,也是置顶的,并获得焦点。这时,如果有其他窗体置顶时,当然看不到,因为没有获得焦点,最好用热键启动其他窗体置顶:SetWindowPos Me.hwnd,-1,0,0,0,0,3 或者在Timer事件中将其他窗体获得焦点即可(这个时候游戏只能看,不能操作,没有焦点)。
losegames 2008-02-15
  • 打赏
  • 举报
回复
您是说用 SetWindowPos 设置父窗口吗!?
请问能不能给我一个简单的范例呢!?
ebaiyun 2008-02-14
  • 打赏
  • 举报
回复
关注.
buzhihuigai 2008-02-14
  • 打赏
  • 举报
回复
可以设置父窗口啊

1,488

社区成员

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

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