首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教,如何将一个窗体放在桌面之上,但又不会 遮住其它窗口 [已结贴,结贴人:weiyulin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:08:43 楼主
    如体
    60  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 12:30:421楼 得分:0
    VB调用API函数使窗口保持在最上层
    ---- 我们看到有的应用程序不管窗口是否活动都使窗口保持在最上层,常见的Microsoft Word的文件打开和编辑查找窗口就是这样。在VB开发中可以通过调用SetWindowsPos()API函数实现这个功能。该函数声明如下:

    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

    ---- hWnd变元是窗口的句柄;x,y是窗口的左上角的坐标;cx、cy是窗口宽度和高度;hWndInsertAfter变元是窗口清单中hWnd窗口前面的窗口句柄,有四个可选值:

    序号 可 选 值 作 用
    1 HWND_BOTTOM 把窗口放在窗口清单的底部
    2 HWND_TOP 把窗口放在窗口清单的字符顺序的顶部
    3 HWND_TOPMOST 把窗口放在窗口清单的顶部
    4 HWND_NOTOPMOST 把窗口放在窗口清单的顶部,最上层窗口之下

    ---- WFlags变元为整型值,有八个可选值:

    序号 可 选 值 作 用
    1 SWP_DRAWFRAME 在窗口周围画一个方框
    2 SWP_HIDEWINDOW 隐藏窗口
    3 SWP_NOACTIVATE 不激活窗口
    4 SWP_NOMOVE 保持窗口当前位置
    5 SWP_NOREDRAW 窗口不自动重画
    6 SWP_NOSIZE 保持窗口当前尺寸
    7 SWP_NOZORDER 保持窗口在窗口清单中的当前位置
    8 SWP_SHOWWINDOW 显示窗口

    ---- 下面的例子程序Test演示了对函数中的以上7个变元作正确的选择后,应用程序运行后窗口总可保持在最上层,程序清单如下:

    Option Explicit
    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 HWND_TOPMOST = -1
    Private Const SWP_SHOWWINDOWS = &H40

    Private Sub Form_Load()
    Dim retValue As Long
    retValue = SetWindowPos(Me.hwnd,
    HWND_TOPMOST, Me.CurrentX, _
    Me.CurrentY, 300, 300, SWP_SHOWWINDOWS)
    End Sub
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:19:042楼 得分:0
    就想桌面一样

      在最下面

        但不会  档住其它窗口


        我是需要 做一个 模拟的桌面窗口
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 13:56:073楼 得分:0
    谁能帮我  50 Q币赠送  绝不食言

      愿意的加我QQ :100510037

        另一个问题就是,在这个问题的基础上,这个窗体  不能让他最小化,就是说当按下Win + D 时 也不会最小化

        就是和系统桌面一个样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 15:15:344楼 得分:0
    这个不是很好办。
    当它获得“焦点”时,自然的被系统提到前面来了。
    除非不停地把窗体置于最底层。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shawls
    • 等级:
    发表于:2008-05-17 15:18:595楼 得分:0
    大家看看飞雪桌面日历
    估计楼主就是要这个效果
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 16:16:106楼 得分:0
    方法呢

      如果哪位知道  麻烦加我QQ  我说的话 绝对算
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 17:09:497楼 得分:0
    引用 6 楼 weiyulin 的回复:
    方法呢

      如果哪位知道  麻烦加我QQ  我说的话 绝对算


    已经实现了嘛,似乎楼主没什么反应了....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 22:02:028楼 得分:0
    其实很简单,,,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 22:29:579楼 得分:0
    '别人窗口置顶, 俺可以 置底 吧?

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

    Private Sub Form_Load()
    Dim rtn&
    rtn = FindWindow(vbNullString, "Program Manager")
    SetParent Me.hWnd, rtn
    End Sub


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-17 23:47:4410楼 得分:0
    我倒没注意到这样可以把窗口“置底”。

    楼主在 3楼 说的问题也搞定了。
    你的 50Q币 可以给 CMB666 了吧!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:04:4511楼 得分:0
    WIN+D也不会最小化也解决了吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:31:5012楼 得分:0
    引用 10 楼 Chen8013 的回复:
    我倒没注意到这样可以把窗口“置底”。

    楼主在 3楼 说的问题也搞定了。
    你的 50Q币 可以给 CMB666 了吧!


    老刘上面那个代码显然不行的,我随便做个什么程序  标题就叫Program Manager  运行起来,你试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:33:3313楼 得分:0
    问题我已经加QQ给他解决了,呵呵,各位就不要和我抢拉,等他QB冲上来后,我再把代码发出来,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:35:1814楼 得分:0
    引用 11 楼 haimin350 的回复:
    WIN+D也不会最小化也解决了吗?


    不会被 Win+D 最小化的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:35:3415楼 得分:0
    引用 11 楼 haimin350 的回复:
    WIN+D也不会最小化也解决了吗?


    不会被 Win+D 最小化的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:36:1216楼 得分:0
    引用 11 楼 haimin350 的回复:
    WIN+D也不会最小化也解决了吗?


    不会被 Win+D 最小化的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:41:4017楼 得分:0
    Win + D 时 也不会最小化 , 哎....懒得写了, 难道你自己不会试一下去屏蔽 win + D ? 非要我来帮你写 ?

    别那么懒啦.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 00:41:5618楼 得分:0
    怎么老是报错,说什么服务器积极拒绝....


    再来一遍

    老刘的代码不行,随便用VB6新建一窗体,Text就叫"Program Manager",再试试代码就知道了

    再说,即使没有同名的应用程序,贴到底了,怎么回复原来状态?


    我下午已经给加QQ解决了,嘿嘿,大家就别和我抢拉...

    楼主说明天才给我冲QB,呵呵,我也不要这么多,有一半就不错了,过了后我会把代码贴上来的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 01:27:5019楼 得分:0
    哎..... 为什么脑子都不会动一下下呢 ?

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Dim starttm&
    Private Sub Form_Load()
      Dim rtn&
      rtn = FindWindow(vbNullString, "Program Manager")
      SetParent Me.hWnd, rtn
      Timer1.Enabled = True
      Timer1.Interval = 100
      If App.PrevInstance Then End
    End Sub

    Private Sub Timer1_Timer()
      If Me.WindowState = 1 Then
          Timer1.Enabled = False
          Me.SetFocus: SendKeys Chr(13)
          starttm = Timer
          Do
            DoEvents
          Loop Until Timer >= starttm + 1
          Timer1.Enabled = True
      End If
    End Sub
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 01:55:1320楼 得分:0
    给楼主找了点资料
    http://blog.csdn.net/jim3/archive/2008/02/28/2128274.aspx

    前几天在网上看到一个软件的介绍:可以嵌入桌面,即使是“显示桌面”也不会影响此程序。看作者说的好像有多么的神奇一样。周未就回来试一下。最后发现,Windows这个桌面还真是复杂和有意思。
      首先要分析Windows桌面。
      打开老牌软件"Spy Window"。查看一下桌面。取得一个“SysListView32”类的句柄(本系统为XP版本)。将其最小化,可以看出刚才取得的控件好像是透明的。因为将其最小化之后,还可以看到你所设置的桌面图片。
       重新用"Spy Window"获取桌面上的控件句柄(也可以直接点击"Parent Window"取得其父窗口句柄),得到一个"SHELLDLL_DefView"类的句柄。将其最小化,可以看到桌面图片依然存在,难道又是一个透明控 件吗?先不理会它,我们继续向“下”找。再一次取得“桌面”上一个类名为“Progman”的控件句柄。而且此时你会发现Spy Window的"Parent Window"按钮已不可用了。
      这个类为“Progman”的窗口“下面”真的没有其它窗口了吗?按 “Ctrl+Alt+Del“在任务管理器里结束“explorer”,后再使用“Spy Window”看一下,是不是又有一个类名为“#32769”的窗口出了。试着对此窗口进行禁用,最小化,隐藏操作试一下。好像一切都是无效的。
      到此为至,应该说把这张桌面的结构搞清楚了。相当于图像处理中的四个图层,而且是透明图层。
      按类名由前至里的排序为:
      SysListView32
      SHELLDLL_DefView
      Progman
      #32769
      看来这个桌面果然不是一般的复杂。
      回忆一下以前用代码来隐藏桌面的操作:
      FindWindow(''''Progman'''',Nil);
      ShowWindow(...);
      这里的''''Progman''''就是第三层(本文中我们就以层来称呼它们)的窗口了。在结束进程“Explorer”时,此窗口消失,说明此窗口是由“Explorer.exe”建立的。
      下面进行将程序嵌入到桌面里的操作。
      这里所需要的只有一个语句:
      FrmMain.ParentWindow:=ParentHandle;其中,ParentHandle是你所要嵌人的控件句柄。
      按此实现,可以建立一个窗体,拖入一个TButton,一个TEdit。在Button的Click事件中写入代码FrmMain.ParentWindow:=StrToInt(EdtHandle.Text);
      下面,先来嵌入“第一层桌面”看一下。用"Spy Window”取得当前桌面句柄,也就是第一层''''SysListView32''''。转为十进制后复制到EdtHandle。点击按钮。
      程序是不是转为非焦点状态了。按一下“Win+D”(显示桌面)。是不是窗口仍停留在桌面上。
      好像文章开头的目的已经实现了。
      仔细测试一下当前的窗体,是不是与原来有很大的不同。首先,窗口的标题栏总是非焦点状态。第二窗体上的右击被桌面拦截了下来。
      第三Edit里表显不出TEdit本身对消息的响应。如点击时,拖动时,按键时右击时,Edit缺少相应的闪烁输入光标,抹黑所选字符,文字处理,显示上下文菜单等。这是因为窗体得不到焦点,而得不到焦点对于TEdit控件来说,一切都是无效的。
      动态取得第一层控件句柄的方法是:
      TmpHandle:=FindWindow(''''Progman'''',Nil);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      此时TmpHandle即是桌面的句柄了。
      依照此方法,我们可以将窗体嵌入第二层''''SHELLDLL_DefView''''了。当嵌入第二层时,你会发现。所嵌入的程序窗口不见了。当我们把第一层最小化时,可以看到我们所嵌入的窗口是存在的。只是被第一层所遮住了。所以说,第一层并不是透明的!
       第一层最小化之后,可以看到,桌面上的图标都不见了。再看一下第一层的类名“SysListView32”,可以确定,第一层这个控件的作用主要就是列 出系统桌面上的图标。我们在当前第二层中点击一下右键。桌面菜单出来了吧?原来一切的消息及处理都是在这一层接收和处理的。这时可以用“新建”命令新建一 个文档,之后再恢复第一层桌面,可以看到,新建的文档出现了。
      可以这样理解,第一层是“显示层”,第二层是“功能层”。我们的窗体在这里是显示不出来的。而且同样得不到焦点。
       现在,将我们的程序嵌入到第三层''''Progman'''',嵌入之后,出现了和第二层相同的结果,按功能来说这一层应该没有什么实际的用途,可能 只是给上面两层提供一个容器。现在''''Progman''''中有了两个窗体,一个是原有的''''SHELLDLL_DefView'''',另一 个便是这个嵌入窗体。但是前者用尽了所有的可视区域,所以才使得嵌入的窗体显示不出来。这种情况似乎平时也会遇到,那我们在嵌入时加入一句: BringWindowToTop(FrmMain.Handle);试试;
      呵呵,看到了什么?是不是嵌入的窗口出现了?按一下"Win+D"看一下。如何?还在吧?如果桌面上有图标的话,此时这个窗体应该是挡遮住了一部分图标的。
    处理的办法就是将上一层窗体缩小。如:
      TmpHandle:=FindWindow(''''Progman'''',Nil);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      MoveWindow(TmpHandle,0,20,1024,740,False);
      这样,在窗体顶部留出了二十象素的高度。可以放一个任务栏式的窗体了。
      现在只剩下最后一层"#32769"了。只要在系统登陆前的启动程序不变,此窗口的句柄应该是不变化的(有可能系统登陆前启动的程序有变化此句柄也不变,具体情况没试过)。
      按前面的方法将窗体嵌入到此窗口中。
       窗体又是得不到焦点的状态了。可以看出来这和嵌入到第一层差不多。但是我们拖动一下窗体看一下。此时窗体并不是实时跟随鼠标的。再仔细看一下,任务栏上 出现了两个此程序的按钮。一个是程序的名称,一个是窗口的名称。这是一种奇怪的现象,从来没有见过的。或许我们可以这样解释它。Explorer会将符合 要求的窗体显示在任务栏上(非ToolsWindows,并且可见)。本窗体就符合,而且Explorer又会将窗口"#32769"里的所有窗口放到任 务栏上而不管它是否复。所以才会得到此结果。
      总结一下:
      Windows的桌面是分四层的。嵌入的窗体如果嵌入到第三层,并将Z轴顺序移到最上的话,程序就会一个正常的嵌入桌面的程序。这符合我们的要求。而且可以通过调整第二层的大小来使窗体不遮住桌面图标。所以,将窗体嵌入到此是很理想的。
      第一层的嵌入也是可以的。但是在这里窗体会得不到焦点和使用不了右键。所以这里的窗体受很多限制。
      第二层是一个根本不考虑嵌入窗体的地方,因为这里的窗体根本显示不出来。而且与第一层相同的得不到焦点。
      第四层是个意外的层。嵌在这里的窗体会表显出异样的情况。唯一值得我们嵌入的理由是:它不会随Explorer.exe进程的结束而关闭。


    用mfc实现就是这样的代码
    HWND hDesktop = ::FindWindow("Progman", NULL);
    hDesktop = ::GetWindow(hDesktop, GW_CHILD);
    CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
    this->SetParent(pWndDesktop);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 01:55:5221楼 得分:0
    给楼主找了点资料

    前几天在网上看到一个软件的介绍:可以嵌入桌面,即使是“显示桌面”也不会影响此程序。看作者说的好像有多么的神奇一样。周未就回来试一下。最后发现,Windows这个桌面还真是复杂和有意思。
      首先要分析Windows桌面。
      打开老牌软件"Spy Window"。查看一下桌面。取得一个“SysListView32”类的句柄(本系统为XP版本)。将其最小化,可以看出刚才取得的控件好像是透明的。因为将其最小化之后,还可以看到你所设置的桌面图片。
       重新用"Spy Window"获取桌面上的控件句柄(也可以直接点击"Parent Window"取得其父窗口句柄),得到一个"SHELLDLL_DefView"类的句柄。将其最小化,可以看到桌面图片依然存在,难道又是一个透明控 件吗?先不理会它,我们继续向“下”找。再一次取得“桌面”上一个类名为“Progman”的控件句柄。而且此时你会发现Spy Window的"Parent Window"按钮已不可用了。
      这个类为“Progman”的窗口“下面”真的没有其它窗口了吗?按 “Ctrl+Alt+Del“在任务管理器里结束“explorer”,后再使用“Spy Window”看一下,是不是又有一个类名为“#32769”的窗口出了。试着对此窗口进行禁用,最小化,隐藏操作试一下。好像一切都是无效的。
      到此为至,应该说把这张桌面的结构搞清楚了。相当于图像处理中的四个图层,而且是透明图层。
      按类名由前至里的排序为:
      SysListView32
      SHELLDLL_DefView
      Progman
      #32769
      看来这个桌面果然不是一般的复杂。
      回忆一下以前用代码来隐藏桌面的操作:
      FindWindow(''''Progman'''',Nil);
      ShowWindow(...);
      这里的''''Progman''''就是第三层(本文中我们就以层来称呼它们)的窗口了。在结束进程“Explorer”时,此窗口消失,说明此窗口是由“Explorer.exe”建立的。
      下面进行将程序嵌入到桌面里的操作。
      这里所需要的只有一个语句:
      FrmMain.ParentWindow:=ParentHandle;其中,ParentHandle是你所要嵌人的控件句柄。
      按此实现,可以建立一个窗体,拖入一个TButton,一个TEdit。在Button的Click事件中写入代码FrmMain.ParentWindow:=StrToInt(EdtHandle.Text);
      下面,先来嵌入“第一层桌面”看一下。用"Spy Window”取得当前桌面句柄,也就是第一层''''SysListView32''''。转为十进制后复制到EdtHandle。点击按钮。
      程序是不是转为非焦点状态了。按一下“Win+D”(显示桌面)。是不是窗口仍停留在桌面上。
      好像文章开头的目的已经实现了。
      仔细测试一下当前的窗体,是不是与原来有很大的不同。首先,窗口的标题栏总是非焦点状态。第二窗体上的右击被桌面拦截了下来。
      第三Edit里表显不出TEdit本身对消息的响应。如点击时,拖动时,按键时右击时,Edit缺少相应的闪烁输入光标,抹黑所选字符,文字处理,显示上下文菜单等。这是因为窗体得不到焦点,而得不到焦点对于TEdit控件来说,一切都是无效的。
      动态取得第一层控件句柄的方法是:
      TmpHandle:=FindWindow(''''Progman'''',Nil);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      此时TmpHandle即是桌面的句柄了。
      依照此方法,我们可以将窗体嵌入第二层''''SHELLDLL_DefView''''了。当嵌入第二层时,你会发现。所嵌入的程序窗口不见了。当我们把第一层最小化时,可以看到我们所嵌入的窗口是存在的。只是被第一层所遮住了。所以说,第一层并不是透明的!
       第一层最小化之后,可以看到,桌面上的图标都不见了。再看一下第一层的类名“SysListView32”,可以确定,第一层这个控件的作用主要就是列 出系统桌面上的图标。我们在当前第二层中点击一下右键。桌面菜单出来了吧?原来一切的消息及处理都是在这一层接收和处理的。这时可以用“新建”命令新建一 个文档,之后再恢复第一层桌面,可以看到,新建的文档出现了。
      可以这样理解,第一层是“显示层”,第二层是“功能层”。我们的窗体在这里是显示不出来的。而且同样得不到焦点。
       现在,将我们的程序嵌入到第三层''''Progman'''',嵌入之后,出现了和第二层相同的结果,按功能来说这一层应该没有什么实际的用途,可能 只是给上面两层提供一个容器。现在''''Progman''''中有了两个窗体,一个是原有的''''SHELLDLL_DefView'''',另一 个便是这个嵌入窗体。但是前者用尽了所有的可视区域,所以才使得嵌入的窗体显示不出来。这种情况似乎平时也会遇到,那我们在嵌入时加入一句: BringWindowToTop(FrmMain.Handle);试试;
      呵呵,看到了什么?是不是嵌入的窗口出现了?按一下"Win+D"看一下。如何?还在吧?如果桌面上有图标的话,此时这个窗体应该是挡遮住了一部分图标的。
    处理的办法就是将上一层窗体缩小。如:
      TmpHandle:=FindWindow(''''Progman'''',Nil);
      TmpHandle:=GetWindow(TmpHandle,GW_CHILD);
      MoveWindow(TmpHandle,0,20,1024,740,False);
      这样,在窗体顶部留出了二十象素的高度。可以放一个任务栏式的窗体了。
      现在只剩下最后一层"#32769"了。只要在系统登陆前的启动程序不变,此窗口的句柄应该是不变化的(有可能系统登陆前启动的程序有变化此句柄也不变,具体情况没试过)。
      按前面的方法将窗体嵌入到此窗口中。
       窗体又是得不到焦点的状态了。可以看出来这和嵌入到第一层差不多。但是我们拖动一下窗体看一下。此时窗体并不是实时跟随鼠标的。再仔细看一下,任务栏上 出现了两个此程序的按钮。一个是程序的名称,一个是窗口的名称。这是一种奇怪的现象,从来没有见过的。或许我们可以这样解释它。Explorer会将符合 要求的窗体显示在任务栏上(非ToolsWindows,并且可见)。本窗体就符合,而且Explorer又会将窗口"#32769"里的所有窗口放到任 务栏上而不管它是否复。所以才会得到此结果。
      总结一下:
      Windows的桌面是分四层的。嵌入的窗体如果嵌入到第三层,并将Z轴顺序移到最上的话,程序就会一个正常的嵌入桌面的程序。这符合我们的要求。而且可以通过调整第二层的大小来使窗体不遮住桌面图标。所以,将窗体嵌入到此是很理想的。
      第一层的嵌入也是可以的。但是在这里窗体会得不到焦点和使用不了右键。所以这里的窗体受很多限制。
      第二层是一个根本不考虑嵌入窗体的地方,因为这里的窗体根本显示不出来。而且与第一层相同的得不到焦点。
      第四层是个意外的层。嵌在这里的窗体会表显出异样的情况。唯一值得我们嵌入的理由是:它不会随Explorer.exe进程的结束而关闭。


    用mfc实现就是这样的代码
    HWND hDesktop = ::FindWindow("Progman", NULL);
    hDesktop = ::GetWindow(hDesktop, GW_CHILD);
    CWnd* pWndDesktop = CWnd::FromHandle(hDesktop);
    this->SetParent(pWndDesktop);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 09:07:1722楼 得分:0
    这CSDN论坛怎么啦?
    这个贴子,楼上有10个回复看不到。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 09:08:3423楼 得分:0
    引用 11 楼 haimin350 的回复:
    WIN+D也不会最小化也解决了吗?


    不会被 Win+D 最小化的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 09:16:0124楼 得分:0
    引用 22 楼 Chen8013 的回复:
    这CSDN论坛怎么啦?
    这个贴子,楼上有10个回复看不到。


    CSDN改版算是越改越烂,以前都不这样的

    昨晚上回复一直是目标服务器积极拒绝....
    rtn = FindWindow(vbNullString, "Program Manager")
    SetParent Me.hWnd, rtn


    做个测试:

    新建另外一个VB6 EXE,
    Private Sub Form_Load()
    Form1.Caption = "Program Manager"
    End Sub

    跑起来,然后再试那2句代码,看看效果~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 09:28:5925楼 得分:0
    我昨天下午已经加QQ给楼主解决了,,嘿嘿,大家就不要跟我抢拉,,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 10:53:0526楼 得分:0
    窗口透明行不行?
    或者半透明!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 11:21:3027楼 得分:0
    引用 24 楼 yinweihong 的回复:
    .............

    CSDN改版算是越改越烂,以前都不这样的

    昨晚上回复一直是目标服务器积极拒绝....
    rtn = FindWindow(vbNullString, "Program Manager") 
    SetParent Me.hWnd, rtn 


    做个测试:

    新建另外一个VB6 EXE, 
    Private Sub Form_Load()
    Form1.Caption = "Program Manager"
    End Sub

    跑起来,然后再试那2句代码,看看效果~


    这种勾当你都做得出来, I 服了 U !

    ^_^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 11:41:3728楼 得分:0
    引用 27 楼 Chen8013 的回复:
    引用 24 楼 yinweihong 的回复:
    .............

    CSDN改版算是越改越烂,以前都不这样的 

    昨晚上回复一直是目标服务器积极拒绝.... 
    rtn = FindWindow(vbNullString, "Program Manager") 
    SetParent Me.hWnd, rtn 


    做个测试: 

    新建另外一个VB6 EXE, 
    Private Sub Form_Load() 
    Form1.Caption = "Program Manager" 
    End Sub 

    跑起来,然后再试那2句代码,看看效果~


    这种勾当你都做得出来,…



    楼主既然答应给QB,所以,呵呵,我在等楼主给我冲QB啊,  完了我给大家把代码贴出来,呵呵~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 12:14:5529楼 得分:0
    随便你什么时候贴出来,我也没兴趣跟你抢Q币。你放心好了 ^_^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 12:19:49