Rob and all,

I solved the problem (with some help from MikeR on the progdigy.com
forum) by using a combination of making my window Topmost
(HWND_TOPMOST), and finding the the Powerpoint Show's handle to call
windows.SetForegroundWindow(h). That sets Powerpoint to foreground
with every timer tick of my program.

I'll paste the code below.

Thanks,

Tim.


--- In delphi-en@yahoogroups.com, Rob Kennedy <[EMAIL PROTECTED]> wrote:

> Apparently, PowerPoint pauses when it loses focus. ...
> On the other hand, maybe you could arrange for your program's window to 
> be always on top, and then redirect focus back to the PowerPoint
window. 
> You'll have to find which window that is. Use WinSight of Spy++ to 
> figure out what PowerPoint's window class is, and use FindWindow in
your 
> program to get a handle to that window. Then use SetFocus.
> 
> -- 
> Rob
>




function EnumWindowsProc(wHandle: HWND; slT: TStringList): Bool;
stdcall; export;
var
  Title, ClassName: array[0..255] of char;
begin
  Result := True;
  GetWindowText(wHandle, Title, 255);
  GetClassName(wHandle, ClassName, 255);
  if IsWindowVisible(wHandle) then
     slT.Add(string(Title) + '^' + string(ClassName));
end;



procedure TForm1.UpdateClock(Sender: TObject);
Var
  Xo, Yo, X, Y  : Integer;
  TimerStr : string;
  StringListT : TStringList;
  T_string,C_string,TC_string : string;
  z,ix,sp : integer;
  h: hwnd;

begin

  with Self do {Form1,...}
    SetWindowPos(Handle, // handle to window
                 HWND_TOPMOST, // placement-order handle {*}
                 Left,  // horizontal position
                 Top,   // vertical position
                 Width,
                 Height,
                 // window-positioning options
                 SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

  if not noPPT then begin
      StringListT := TStringList.create;
      try
          Windows.EnumWindows(@EnumWindowsProc, Integer(StringListT));

          if DebugMode then begin
              StringListT.SaveToFile('enum.txt');
              DebugMode := False;
              end;

          ix := -1;
          for Z := 0 to StringListT.count-1 do begin
             sp := pos('PowerPoint Slide Show',StringListT[Z]);
             if sp <> 0 then begin     // found it
               ix := Z;
               break;
               end;
             end;

          if ix <> -1 then begin
              TC_String := StringListT[ix];

              sp := pos('^',TC_String);
              T_string := copy(TC_string,1,sp-1);
              C_string := copy(TC_string,sp+1,255);

              h := Windows.FindWindow(pchar(C_STring),nil);  // find
using class name from enum
              if h<>0 then
                 windows.SetForegroundWindow(h)
              else begin
                 noPPT := true;
//                 ShowMessage('FindWindow Failed: Is Powerpoint Show
Running?');
                 end
              end {if ix}
          else begin
//              ShowMessage('Powerpoint Slide Show not found');
              noPPT := true;
              end;

        finally
          StringListT.Free;
        end; {try}
      end; {if not noPPT}

     TimerStr := FormatDateTime('n:ss',Countdown);

  { Set font properties }
  Canvas.Font.Style:=[fsBold];
  Canvas.Font.Name:='TimesNewRoman';

  Canvas.Brush.Style:=bsSolid;

  Canvas.Font.Size:=TextSize;
  Canvas.Font.Color:=FGColor;


  { Set center point }
  Xo:=Form1.Width Div 2;
  Yo:=Form1.Height Div 2;

  if ExtraTextMode then begin
      X := Xo - (Canvas.TextWidth(ExtraText) div 2);
      Y := Yo - (Canvas.TextHeight(ExtraText) + (TextMargin div 2));
                  {top of upper text is up by text height and half margin}
      Canvas.TextOut(X,Y,ExtraText);
      X := Xo - (Canvas.TextWidth(TimerStr) div 2);
      Y := Yo + (TextMargin div 2);   {top of lower text is half of
margin between two lines}
      Canvas.TextOut(X,Y,TimerStr);
      end
  else begin
      X := Xo - (Canvas.TextWidth(TimerStr) div 2);
      Y := Yo - (Canvas.TextHeight(TimerStr) div 2);
      Canvas.TextOut(X,Y,TimerStr);
      end;

  if Countdown <= 0 then with application do begin
    Timer1.enabled := False;
    Close;  // quit program at count of 0
    end;

End;



Reply via email to