preview screen saver

How to preview screen saver in tiny box(Like Control Panel--->Desktop does) ?

I can launch screensavers in preview mode, but, they go full screen, instead of confining themselves to the handle of the object I supply.

I am using:

ShellExec(application.handle,
nil,
pchar('?:\path\ssname.scr'),
pchar(' /p '+IntToStr(MyHandle)),
nil,
SW_SHOWNORMAL)

where:

MyHandle:=Image1.Canvas.Handle; // this is a typical example

When I execute the SHellExec line IMage1 changes colour (it goes white instead of the initial grey), but, the chosen screen saver previews itself in full screen mode.


Give me a clue, somebody, anybody, please ....

LVL 4
David_WardAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ziolkoCommented:
SW_SHOWNORMAL means that screensaver will be run in its normal mode which is full screen

screen savers are normal applications (see: http://www.mindspring.com/~cityzoo/scrnsavr.html how to do it in delphi)
so to preview you might try with MoveWindow() to resize/move to desired position

ziolko.
0
David_WardAuthor Commented:
No,

the nShowCommand parameter serves absolutely no purpose for ScreenSavers, but it has to be set to -something- to keep the ShellExec command happy.

However, just to be on the safe side, I have tested each and every available value and the behaviour of my test program is the same, irrespective of that setting.


Remember, I am NOT writing ScreenSavers, I just want to execute ScreenSavers from my Delphi app and have the selected ScreenSaver execute within the confines of a component in a form of that same Delphi app.
0
ziolkoCommented:
yeah i know you're not writting ss, i just wanted to point where problem might be.

another idea, use CreateProcess instead ShellExecute()
theres param lpStartupInfo which is pointer to record: STARTUPINFO
try setting:
  dwX;  dwY;  dwXSize;  dwYSize

maybe this will display ss in place you want with desired size

ziolko.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

Eddie ShipmanAll-around developerCommented:
I know how to open the CP Screensavers page:
  ShellExecute(Handle, PChar('open'), PChar('rundll32.exe'),
                       PChar( 'shell32.dll,Control_RunDLL desk.cpl,,1'), nil, SW_NORMAL);

How to run a scr in preview mode, I don't think you can do that.
0
Eddie ShipmanAll-around developerCommented:
Apparently, you have to pass the handle of the window where you want to show the preview:

The Preview Mode
As you might have noticed the Preview command has a slight catch. This is the tricky part of the project. We need to show the screen saver in the small preview window in the Display properties dialog. The "/p" command sends a number which is the hWnd of the Display properties dialog. hWnd is a number that is used in Win API to identify each window. The best way to implement the preview mode, is to display the screen saver window as a child to the Display properties. That is what all those API does in the code!

But, it must be the handle of the display properties dialog or you have to create a window with a specific classname.
0
Eddie ShipmanAll-around developerCommented:
Now, this shows the display properties dialog with the passed screensaver in the preview window:

  ShellExecute(Handle, PChar('open'), PChar('rundll32.exe'),
               PChar( 'desk.cpl,InstallScreenSaver c:\win\system\Flying Windows.scr),
               nil, SW_NORMAL);
0
David_WardAuthor Commented:
Hi Eddie,

>>But, it must be the handle of the display properties dialog or you have to create a window with a specific classname.

Where did you get this info?
0
Eddie ShipmanAll-around developerCommented:
I pieced it together from several sources, including MSDN and some screensaver code from various sources.
0
David_WardAuthor Commented:
Thanks guys,

both of you provided useful hints and it is all "good" now.
0
Eddie ShipmanAll-around developerCommented:
So would you mind posting your final solution as help to others?
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.