2010-07-14 82 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; 
相关问题