Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Жесткий фокус окна


Автор: uvsoft 23.6.2005, 21:49
Нужен жесткий фокус окна, что б как только, так сразу... SetActiveWindow хреново работает (запускается, например, диспетчер задач и фокус на нем же и остается - никакого эффекта) , Альт-Табить тож как-то неочень...
Спасиб

Автор: Poseidon 23.6.2005, 22:31
Что-то я этот русский плохо понимаю, но все же попробуй искать окно не через SetActiveWindow, а через FindWindow.

Автор: Quadr0 23.6.2005, 23:06
...

Автор: Rrader 24.6.2005, 10:24
 Это может быть чревато глюками, если два окна будут стремиться иметь такой фокус.
Код

type    
  TForm1 = class(TForm)    
    procedure FormCreate(Sender: TObject);    
  private    
    { Private declarations }    
  public    
    procedure OnDeactivateProc(Sender: TObject);    
    { Public declarations }    
  end;    
var    
  Form1: TForm1;   
 
implementation    

{$R *.dfm}    

procedure TForm1.OnDeactivateProc(Sender: TObject);    
var    
  SubH: THandle;    
begin    
  SubH := GetForegroundWindow;    
  if SubH <> Handle then    
  begin    
    SetWindowPos(SubH, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);    
    SetForegroundWindow(Handle);    
  end;    
end;    

procedure TForm1.FormCreate(Sender: TObject);    
begin    
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOSIZE or SWP_NOMOVE);    
  Application.OnDeactivate := OnDeactivateProc;    
end;  
  
end.
 

Автор: Girder 24.6.2005, 13:01
Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Interval:=10;
 Timer1.Enabled:=true; //Запускаем
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Timer1.Enabled:=false; //При закрытии останавливаем
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var ID,w:DWord;
begin
 Timer1.Enabled:=false;
 w:=GetForegroundWindow();
 ID:=GetWindowThreadProcessId(w,nil);
 if (ID<>GetCurrentThreadID) then
  begin
   Sleep(100);
   AttachThreadInput(GetCurrentThreadID,ID,true);
   SetWindowPos(w,HWND_NOTOPMOST,0,0,0,0,SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE);
   SetWindowPos(Form1.Handle,HWND_TOP,Left,Top,Width,Height,SWP_FRAMECHANGED);
   AttachThreadInput(GetCurrentThreadID,ID,false);
  end;
 Timer1.Enabled:=true;
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)