怎样使一个窗口不能获得焦点,即使用户点击它,它的标题栏也不会变蓝(200分)

  • 主题发起人 主题发起人 universe
  • 开始时间 开始时间
U

universe

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]另外,
1、怎样把一个窗口放在最底层?
2、当窗口获得鼠标信息时,怎样把相应信息传递给该窗口下面的窗口?

如果想要分的话可以另外加分的
 
当然可以了
1.我只知道 GetForegroundWindow ,希望能有用
2.
procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;

procedure TForm2.WMNCHitTest(var Msg: TMessage);
begin
Msg.Result:=0;
end;
 
Brave 說得有理 ,重畫標題欄時還把它設為不激活
 
比如有两个窗口,主窗口Form1,副窗口Form2。
想实现点击Form1上一个Button调出Form2,但Form2不能被激活,Form1上所有Mouse消息传给Form2。
给你一个完整的Form1的pas单元代码——

代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetWindowLong(Form2.Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or WS_DISABLED);
  SetWindowPos(Form2.Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
    or SWP_SHOWWINDOW or SWP_NOACTIVATE);
  Show;
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  with Message do
    case Msg of
      WM_MOUSEFIRST..WM_MOUSELAST: SendMessage(Form2.Handle, Msg, WParam, LParam);
      else inherited;
    end;
end;

end.

——Form2中处理Mouse消息的部分也要按Form1的方法写。
 
为检验消息传递的效果,给出Form2的完整代码。
在Form1上移动鼠标的时候,Form2的标题栏会显示出鼠标相对于Form1的位置。
代码:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.WndProc(var Message: TMessage);
begin
  with Message do
    case Msg of
      WM_MOUSEFIRST..WM_MOUSELAST: Caption := Format('%d, %d', [LParamLo, LParamHi]);
      else inherited;
    end;
end;

end.
 
我把我的问题详述一下,我的程序是一个透明的窗口,上面放了我的东西,透过我的窗口
可以看见下面的窗口(不知是哪个程序的窗口),我的窗口当然是在最上层的,但我的窗
口就好像不存在一样,用户可以通过我的窗口点击下面的窗口的按钮什么的?
是不是很难?
 
你可以采用画边界的形式,把窗口的控件画出来,其他的地方就不要了。
var
r:THandle;
begin
r:=CreateRectRgn(15,15,200,200);
SetWindowRgn(Form2.Handle,r,True);
Form2.Show;
end;
 
看来一开始你没有说清楚问题啊。
我不知道你的透明效果是怎么做的,但我觉得下面这个方法比较简单——

从新建一个Application说起,在Form上放一个Label,设置以下几个属性即可:
Form1.FormStyle=fsStayOnTop,
Form1.TransParentColor=True,
Label1.Align=alClient,
Label1.Color=Form1.TransParentColorValue=选择一种肯定不在窗口标题部分出现的颜色。

此时已完全达到你第二个贴子里的要求,至于Form上再放其它控件,只要注意它们的颜色就行了。
试试看!
 
不好意思,我画蛇添足了,实际上根本不用放什么Label,把我上一贴中的Label1.Color
换成Form1.Color就行了:)也就是只要把一个新Form改四个属性就OK了!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
680
import
I
后退
顶部