我们很容易让一个窗体总在最前,但如何让他总在最后呢?(150分)

  • 主题发起人 主题发起人 luckmiky
  • 开始时间 开始时间
L

luckmiky

Unregistered / Unconfirmed
GUEST, unregistred user!
我见到别人的软件有这样的效果,除了桌面,该窗口永远在任何其他窗口的下面。<br><br>如何做到这种效果,用SetWindowPos不行,点击还是会跑到前面。<br>用Timer不停的检查也不是好办法,还是会有短时间会跑到前面。<br><br>
 
在窗口的onactive中写代码让它回到最后,或者直接处理windows消息让它不响应wm_active
 
那样不行啊,我怎么操作他啊?别人做的是可以操作的啊。
 
http://www.solidlabs.com/alphablender/<br>这里有个软件就可以做到,他连其他窗口都可以给你改掉,可见这应该是Windows本身支持的功能。
 
这里做有什么用?窗体上放个ApplicationEvents1<br><br>procedure TForm1.ApplicationEvents1Activate(Sender: TObject);<br>begin<br>sendtoback;<br>end;<br><br>procedure TForm1.ApplicationEvents1Restore(Sender: TObject);<br>begin<br>sendtoback;<br>end;
 
既然想要它总在最后,那就是不想看见它,那干脆把它Hide 起来岂不更好?呵呵,这样就不用担心它什么时候又“跑”到前面来了。
 
&gt;&gt;&gt;既然想要它总在最后,那就是不想看见它,那干脆把它Hide 起来岂不更好?呵呵,这样&gt;&gt;&gt;就不用担心它什么时候又“跑”到前面来了。<br><br>其实这只是个花哨的动能,把个小软件摆在桌面上,不影响其他操作,这样不是挺好玩吗?
 
看看《DELPHI深度历险》
 
BOOL EnableWindow( &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HWND hWnd,<br>&nbsp; &nbsp; BOOL bEnable<br>);<br><br>设置 对应的handle 的 enable 为false
 
我来:<br><br>Win32 API 使用討論區(C++Builder) &nbsp;<br>如何讓表單永遠在最下層(包含拖曳) &nbsp;<br>發表人 內文 <br>dllee<br>2004/02/13<br>15:18:31 我們在建立表單時可以設定 fsStayOnTop 或由 API SetWindowPos 的 HWND_TOPMOST 將表單變成最上層顯示,但是要如何作到最下層呢?<br><br>我有試過在移動表單的同時將視窗以 SetWindowPos 的 HWND_BOTTOM 設為 onBottom,但在移動時,表單還是會跑到上層,在移完後,再變到下層?<br><br>可是有一些軟體(如桌面月曆)可以在移動時也維持在最下層,How?<br><br><br>--------------------------------------------------------------------------------<br>沒空更新的網頁...<br>http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... <br>m8815010<br>2004/02/14<br>22:27:24 dllee兄你好:<br>看了你的題目我感覺Windows應該在SetWindowPos這個API function中有一個對應HWND_TOPMOST的屬性,可能可以叫HWND_BOTTOMMOST,這樣才比較friendly才對!<br><br>針對dllee兄你用SetWindowPos這個方式來達成目的的話,我試了一下,果然,它並沒有〝For always〞的效果,也就是只有在下指令的一剎那有效,所以我用狂拳打死老師父的方法(老一輩武俠小說中常見的名句)!<br><br>測試鎖死扣:<br><br>in Unit.h &nbsp;~~private: // User declarations &nbsp; &nbsp; &nbsp; &nbsp; void __fastcall FormWndProc(TMessage&amp;); &nbsp; &nbsp; &nbsp; &nbsp; TWndMethod OrgFormWndProc; &nbsp;~~in Unit.cpp//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) &nbsp; &nbsp; &nbsp; &nbsp;: TForm(Owner){ OrgFormWndProc=Form1-&gt;WindowProc; Form1-&gt;WindowProc=FormWndProc;}//---------------------------------------------------------------------------void __fastcall TForm1::FormWndProc(TMessage&amp; Msg){ if (Msg.Msg==WM_SETFOCUS || Msg.Msg==WM_MOVING || Msg.Msg==WM_PAINT) { &nbsp;&lt;---目前這3個應該夠用了! &nbsp; &nbsp; SetWindowPos(Form1-&gt;Handle,HWND_BOTTOM,Form1-&gt;Left,Form1-&gt;Top,Form1-&gt;Width,Form1-&gt;Height,SWP_NOOWNERZORDER); &nbsp; &nbsp; Form1-&gt;Caption=i; &nbsp; &nbsp; i++; } OrgFormWndProc(Msg);}//---------------------------------------------------------------------------<br><br><br>目前上述還測試ok,不曉得有沒有其它的方法!<br><br><br><br><br>發表人 - m8815010 於 2004/02/14 22:30:38<br><br>發表人 - m8815010 於 2004/02/15 16:23:19 <br>conundrum<br>2004/02/15<br>15:18:13 http://delphi.ktop.com.tw/topic.asp?topic_id=39531<br>http://delphi.ktop.com.tw/topic.asp?topic_id=19817<br>http://delphi.ktop.com.tw/topic.asp?topic_id=20644<br>http://delphi.ktop.com.tw/topic.asp?topic_id=25818<br>http://delphi.ktop.com.tw/topic.asp?topic_id=26443<br>http://delphi.ktop.com.tw/topic.asp?topic_id=28089 此未有正確答案<br>http://delphi.ktop.com.tw/topic.asp?topic_id=30728<br>http://delphi.ktop.com.tw/topic.asp?topic_id=40588<br>http://delphi.ktop.com.tw/topic.asp?topic_id=35940<br>http://delphi.ktop.com.tw/topic.asp?topic_id=40598<br>http://delphi.ktop.com.tw/topic.asp?topic_id=41322<br>http://delphi.ktop.com.tw/topic.asp?topic_id=44021<br><br>http://delphi.ktop.com.tw/topic.asp?topic_id=44654 //額外這只是應用部份<br>【BCB】【轉貼】桌面繪畫 <br>http://delphi.ktop.com.tw/TOPIC.ASP?TOPIC_ID=41140<br>http://www.ne.jp/asahi/nagoya/ahomaro/builder/<br><br>【轉貼】TidyDesktopOne <br>http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=44918<br><br>簡單一點 想辦法 把他 釘起來 跑不到移不走永遠最前 可以作假貼於桌面<br>啟用時 使用隱藏表單 又把它釘在貼再桌面的假圖<br><br>由於 不太懂所以亂哈哈啦 哈啦蒙主<br><br><br><br>發表人 - conundrum 於 2004/02/15 16:11:48 <br>dllee<br>2004/02/17<br>14:27:04 感謝 conundrum 提供那麼多與表單相關的文章...<br><br>不過,還是 m8815010 提供的方法比較好用 <br><br>目前還有一點小小的缺陷,在移完後,放開滑鼠的瞬間,會有很明顯的閃動(跑到前景又立刻回到背景),如果還有其他的 Message 需要攔,請再分享一下...<br><br><br>--------------------------------------------------------------------------------<br>沒空更新的網頁...<br>http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... <br>m8815010<br>2004/02/18<br>13:25:12 引言:<br>--------------------------------------------------------------------------------<br><br>目前還有一點小小的缺陷,在移完後,放開滑鼠的瞬間,會有很明顯的閃動(跑到前景又立刻回到背景),如果還有其他的 Message 需要攔,請再分享一下...<br><br>--------------------------------------------------------------------------------<br><br><br><br>dllee兄你好:<br><br>這個問題我try到了,是有,不過我的PC上不好試出來,大概拖放個5、6次才有一次這種情形!<br><br>感覺有點像我之前做repaint時會有閃爍的問題的那種味道!不過快速的由前景跑到背景正表示我們有攔到它跑上來,再把它設下去,只是這步驟有時會慢到肉眼都看的出!<br><br>目前尚沒有決解掉這情形,先回應是說我有空會持續對應這有趣的題目!<br><br>又試出需要加攔的message<br><br>&nbsp;if (Msg.Msg==WM_NCHITTEST) &nbsp; &nbsp; SetWindowPos(Form1-&gt;Handle,HWND_BOTTOM,Form1-&gt;Left,Form1-&gt;Top,Form1-&gt;Width,Form1-&gt;Height,SWP_NOOWNERZORDER); if (Msg.Msg==WM_SIZE) &nbsp; &nbsp; SetWindowPos(Form1-&gt;Handle,HWND_BOTTOM,Form1-&gt;Left,Form1-&gt;Top,Form1-&gt;Width,Form1-&gt;Height,SWP_NOOWNERZORDER);<br><br><br>這兩個比較難試出何時需要用到,賣個關子! <br>dllee<br>2004/02/18<br>19:59:11 引言:<br>--------------------------------------------------------------------------------<br><br>這個問題我try到了,是有,不過我的PC上不好試出來,大概拖放個5、6次才有一次這種情形!<br><br>--------------------------------------------------------------------------------<br><br><br>可能是我用筆記型電腦,顯示卡比較差的關係... 幾乎是每次都會 <br><br>引言:<br>--------------------------------------------------------------------------------<br><br>感覺有點像我之前做repaint時會有閃爍的問題的那種味道!不過快速的由前景跑到背景正表示我們有攔到它跑上來,再把它設下去,只是這步驟有時會慢到肉眼都看的出!<br><br>目前尚沒有決解掉這情形,先回應是說我有空會持續對應這有趣的題目!<br><br>--------------------------------------------------------------------------------<br><br><br>感謝您的繼續測試 <br><br>引言:<br>--------------------------------------------------------------------------------<br><br>又試出需要加攔的message<br><br>&nbsp;if (Msg.Msg==WM_NCHITTEST) &nbsp; &nbsp; SetWindowPos(Form1-&gt;Handle,HWND_BOTTOM,Form1-&gt;Left,Form1-&gt;Top,Form1-&gt;Width,Form1-&gt;Height,SWP_NOOWNERZORDER); if (Msg.Msg==WM_SIZE) &nbsp; &nbsp; SetWindowPos(Form1-&gt;Handle,HWND_BOTTOM,Form1-&gt;Left,Form1-&gt;Top,Form1-&gt;Width,Form1-&gt;Height,SWP_NOOWNERZORDER);<br><br>這兩個比較難試出何時需要用到,賣個關子!<br><br>--------------------------------------------------------------------------------<br><br><br>會再試試以上及其他的 Message... 再次感謝 <br><br><br>--------------------------------------------------------------------------------<br>沒空更新的網頁...<br>http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... <br>jest0024<br>2004/05/06<br>12:02:20 好久以前的問題捏,不過嘛來回答一下我的做法。<br><br>procedure TForm1.Create;var &nbsp; dc:THandle;begin &nbsp;dc:=GetWindow(GetWindow(FindWindow('Progman',nil),GW_CHILD),GW_CHILD); &nbsp;Windows.SetParent(Handle,dc);end;<br><br><br>學而時習之不亦樂乎! <br>dllee<br>2004/05/07<br>13:31:44 引言:<br>--------------------------------------------------------------------------------<br><br>好久以前的問題捏,不過嘛來回答一下我的做法。<br><br>procedure TForm1.Create;var &nbsp; dc:THandle;begin &nbsp;dc:=GetWindow(GetWindow(FindWindow('Progman',nil),GW_CHILD),GW_CHILD); &nbsp;Windows.SetParent(Handle,dc);end;<br><br><br>學而時習之不亦樂乎!<br><br>--------------------------------------------------------------------------------<br><br><br>&nbsp;<br>
 
多人接受答案了。
 
后退
顶部