VB如何把窗体放到最前并且透明.是要放在全屏游戏的前面.我用了下马的代码不成功,根本显示不出来.但是鼠标移动过去点能把他点出来的但是就是看不到窗体是黑的.
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 LongPrivate Sub Timer1_Timer()
SetWindowPos Me.hWnd, -1, 0, 0, 0, 0, 2 Or 1
End Sub
我要实现的功能就是在全屏游戏或者播放电影全屏的时候我的窗口总是能在一个位置显示.

解决方案 »

  1.   

    透明窗体用.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 Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Private Const WS_EX_LAYERED = &H80000
    Private Const GWL_EXSTYLE = (-20)
    Private Const LWA_ALPHA = &H2
    Private Const LWA_COLORKEY = &H1Private Sub Form_Load()
        Dim rtn As Long
        rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
        rtn = rtn Or WS_EX_LAYERED
        SetWindowLong hwnd, GWL_EXSTYLE, rtn
        SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
    End Sub
    这个可以
      

  2.   

    窗体透明用SetLayeredWindowAttributes函数
    '窗体透明API函数的声明
    Const LWA_COLORKEY = &H1
    Const LWA_ALPHA = &H2
    Const GWL_EXSTYLE = (-20)
    Const WS_EX_LAYERED = &H80000
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Public Function SetFormTouMing(INFormHWND As Long, INSetNum As Integer)
        Dim Ret As Long
        Ret = GetWindowLong(INFormHWND, GWL_EXSTYLE)
        Ret = Ret Or WS_EX_LAYERED
        SetWindowLong INFormHWND, GWL_EXSTYLE, Ret
        '设置窗体透明度
        SetLayeredWindowAttributes INFormHWND, 0, INSetNum, LWA_ALPHA
    End Function
    使用方法(举例):SetFormTouMing Me.hwnd, 180然后顶置窗体用SetWindowPos
    因为这个函数比较简单,所以就不解释了哈~
      

  3.   


    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 Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    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
    Private Const WS_EX_LAYERED = &H80000
    Private Const GWL_EXSTYLE = (-20)
    Private Const LWA_COLORKEY = &H1
    Private Const HWND_TOPMOST = -1Private Sub Form_Load()
      Dim rtn As Long
      Me.BackColor = vbBlue
      rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
      rtn = rtn Or WS_EX_LAYERED
      SetWindowLong hwnd, GWL_EXSTYLE, rtn
      SetLayeredWindowAttributes hwnd, vbBlue, 190, LWA_COLORKEY
      SetWindowPos Me.hwnd, HWND_TOPMOST, Me.Left / Screen.TwipsPerPixelX, _
            Me.Top \ Screen.TwipsPerPixelY, Me.Width \ Screen.TwipsPerPixelX, _
            Me.Height \ Screen.TwipsPerPixelY, 0
    End Sub
      

  4.   

    你看我前面写的就是SETWINDOWSPOS但是那个答不到效果.那样游戏在全屏幕的时候根本看不到窗体的.透明的方法已经好了.
      

  5.   

    游戏是DIRECT那一套,SetLayeredWindowAttributes这些不是针对它们的
      

  6.   

    myjian说得对应该不起作用的.但是有什么方法呢,我看游戏的外挂那些就可以在游戏上显示自己的东西出拉.我这个东西是个透明提示框叫大家接收消息的,但是现在很多人爱玩游戏一全屏就没办法看到了.
      

  7.   

    DIRECT那一套我不懂.但是进浩方时发现浩方能在别的游戏的屏幕上显示一些提示文字,所以我想应该也类似窗口机制那样,得到一个屏幕,再操作它看来你得去研究研究DIRECTX了.......
      

  8.   

    把我上面的代码中的Form_Load换成Timer(以确保本置顶代码总是最后执行的,时间根据需要设置即可)
    以上代码显示的窗体级别跟全屏程序是同一级别的,只不过先装载的会被后装载的覆盖(在快播全屏下测试通过, 游戏的全屏原理“应该”也一样。)还有一点:不确定“免打扰模式”对此是否有影响。由于本人不喜游戏,没做过测试,LZ自己测试下哈测试后 麻烦说下结果
      

  9.   

    测试结果是透明可以,在其它地方都可以,但是在全屏游戏下面无法看到.我觉得MYJIAO说的有道理,各位再帮我想想有什么好办法没有.
      

  10.   

    啊哈,看来我的思路是对的.刚刚下了一个使用DIRECTX来混合多个图象的代码,但是我把目标句柄改为记事本了,结果那个效果就绘到了记事本上楼主先要想办法得到透明层的混合代码,再找到游戏的句柄,绘上去应该就行了.对了,那代码在这里下载的:http://www.vbgood.com/viewthread.php?tid=93594
      

  11.   

    我没 VBGood 的 ID ,老马能发我一份吗?[email protected]
    谢谢! 
      

  12.   

    .............晕,第二句就是啊Call X.Initialize(Me.hWnd)