2010-07-14 80 views
3

我有我需要的一切頂級的,所有的時間這些小光標形形式...
FormStyle已經fsStayOnTop
我用這個代碼:如何讓我的表單始終處於最佳狀態?

SetWindowPos(tempCursor.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); 

這(即使我不完全知道它是什麼):

procedure TCursorFrm.CreateParams(var Params: TCreateParams); 
const 
    WS_EX_NOACTIVATE = $8000000; 
begin 
    inherited; 
    Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE; 
end; 

但我仍然無法讓我的表單在TMenuItems的頂部。 我怎樣才能讓我的表格保持在一切?

回答

4

這必須是我將發佈的最終或最糟糕的hackery作品。

  1. 設置你的FormStyle是fsStayOnTop(這一步實際上可能不是必要的)
  2. 刪除您的窗體上的TTimer並設置它的時間間隔爲100
  3. 在OnTimer事件發生下面的代碼:

    if if then then SetWindowPos(Self.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);

我在我的一個項目中使用它,它似乎工作正常。

+0

哇。有用!真的很冒險,但它的作品。謝謝。 :D – Dian 2010-07-15 01:10:43

+3

我擡頭看字典,'hacky'並沒有準確地描述它是如何破解它。我們需要一個新的詞。 – Ampere 2015-10-08 19:32:51

4

我認爲這是一樣好,你會得到。如果您的表單停留在菜單頂部,則用戶在打開菜單時將無法看到菜單。做這樣的事情,特別是當系統不能通過任何簡單的方式使其可用時,就會陷入惡意的境地,或者至少是這樣。你不希望你的用戶認爲你的程序是惡意的,所以我的建議是首先不要試圖做到這一點。

+0

那麼,它應該是一個光標(多個小鼠多個遊標),這就是爲什麼它應該是在上面。遊標位於MenuItems後面有點奇怪。 :(哦,我不認爲用戶會認爲它是惡意的,因爲它看起來不像普通的形式,它看起來像一個正規的光標) – Dian 2010-07-14 03:05:15

+0

哦,這是一個遊標?在這種情況下,爲什麼你試圖用一個*表單實現一個遊標*我確信有一個更簡單的方法,不知道這是什麼,但必須有一個... – 2010-07-14 03:16:13

+0

因爲它在另一個問題和所有除了Menu問題,它的工作很好,我的第一次嘗試是在屏幕畫布上繪製光標,這是一場噩夢(很多很多問題),除了這兩個之外,還沒有找到另一種方式 – Dian 2010-07-14 03:22:03

2

快速,稍微哈克修復:從計時器調用此,每秒10次:

​​

剛纔試了它和它的作品!也許你可以找到一種方法使其不那麼「蠻力」,但我不知道如何。

+0

用定時器試了一下(如你所建議的)。我無法再訪問菜單,當我點擊菜單時,項目出現一瞬間然後它消失了。 – Dian 2010-07-14 06:50:51

+0

什麼「項目」?菜單消失了嗎?如果是這樣,請顯示一些代碼,也許你在某種程度上竊取了菜單中的焦點?在我的測試中,我只是做了一個「留在頂部」窗口,並在文本編輯器中右鍵單擊,導致彈出式菜單正好顯示在窗體下。它按預期工作,菜單沒有消失;當然,我並沒有試圖仿效第二隻鼠標光標...... – 2010-07-14 07:04:04

+1

是的,MenuItems消失了。放在這:BringWindowToTop(Cursor [I] .Handle)在每秒執行的for循環中。是的,我想我正在偷菜的重點。 – Dian 2010-07-14 07:12:54

2

我認爲你可以看看DirectX。我相信它允許覆蓋主圖像。您可以以非獨佔模式打開它並在桌面上繪製覆蓋圖。但我不確定。只是一個猜測。

0

或代替SetWindowPos命令 - 試試這個:

if visible then form1.SetFocus; 
相關問題