I'd like to create an app that I can dock to my screen such that when other windows are maximized they neither obscure my app, nor are they hidden behind my app. "Always on top" is not good enough since other windows can still hide behind it. It should effectively reduce the available size of my monitor and behave like a toolbar. Full screen apps should obscure my "toolbar".
So, eg, if I dock my app to the right side of my 1920 x 1080 monitor and size it to be 200px wide, the largest window I can have open on that monitor would be 1720 x 1080 (or shorter if it is the main monitor with the Windows task bar).
I remember doing this in Windows XP with just an HTML file and some ActiveX controls. XP had some shortcut to use that file as a "toolbar". I can't remember exactly how I did it now.
I haven't seen anything exactly like this on Windows 7. If the HTML hack is still possible (I believe it isn't) that would be ok, but I'd rather create a native, compiled application. Is it possible?
There's an article on CodeProject which seems to provide a sample for what you're looking for. The project is to create a desktop-toolbar which remains docked beside other windows on the screen, even if they're maximized.
During this article we will develop a class named ApplicationDesktopToolbar. This class inherits
System.Windows.Forms.Form. So when we want to make our application to
behave like an appbar all we need to do is inherit from
ApplicationDesktopToolbar instead of System.Windows.Forms.Form.
Original article author: Arik Poznanski
Related
I develop with VS2010 in C# and I would like to create a WPF Window which have a taskbar text different from the Window title.
The property Title set both the window title and the taskbar text. Is there a way to set them separatly?
First, let me reinforce what Cody Gray said in both his answer and comment - this is non-standard behavior, and you should have a darn good reason for doing this.
That being said, I would take a nearly opposite approach to Cody's point #1. I would create a window WindowStyle set to None, and recreate the title bar (which could include the icon, your "pseudo-title," minimize, maximize, and close buttons, and perhaps even the standard Windows menu. You will also need to handle resizing (which can be done by setting ResizeMode to CanResizeWithGrip, but it adds a Grip control to the bottom of your window, which makes it look slightly different than a "normal" window).
The Title property of this window would then be the Title you want to show in the Taskbar, and the "pseudo-title" in the title bar you create would just be a Label or TextBlock bound to whatever you want your window to show.
It is a little complex, but really not too difficult to do. You will probably run into some Gotchas along the way (for instance, how the Window looks on different OS's or with different Windows themes applied). The nice thing is that it requires no Interop, and a majority of it can be attained using XAML only.
There are lots of examples online (here is one I picked at random).
Again, you'll have to decide if it is worth the effort to create a non-standard behavior. YMMV.
Basically, you have two options:
Draw the taskbar button yourself, rather than letting Windows handle it. This is actually reasonably simple, as far as owner drawing things goes.
Manage two different forms/windows simultaneously. You'll need to create a hidden main window that will appear on the taskbar and own your second window. Your second window will be visible, display its own caption on its title bar, and contain your actual user interface, but won't show up on the taskbar (set its ShowInTaskbar property to "False"). You'll have to write code to show the second window whenever the first one is activated using the taskbar.
I recommend that before starting down either one of these paths, you carefully consider whether you really need this "functionality". It's difficult to tell what goes with what if you have what is effectively one window with different names in different places.
try to use this:
http://www.codeguru.com/forum/showthread.php?t=3833
in conjunction with
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b97a6de-0480-4339-8ed0-cb7cdb27bd83
The first one works fine for me in classical .NET form application when I have made window without title bar and want some text in task bar icon.
The second one you need to handle low level WIN32 messages in WPF window (but this works only for top level one).
I have an application designed in visual C# that is about a quarter of a normal computer screen. The reason its that small is because its easier to work with in Visual Studio. However, I would prefer if when I run it, it maximizes to the full screen. I tried this in my Main_Load:
this.WindowState = FormWindowState.Maximized;
This causes the window itself to maximize, but the application itself is still quarter of the screen. Is there a way to maximize the application itself, and not just the window?
I am guessing you have not docked or anchored any of the controls, meaning they will not move when the window is resized.
Have a look at docking here: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dock(v=vs.110).aspx
And have a look at anchoring controls here: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.anchor(v=vs.110).aspx
Both pages should help you understand how to make controls resize with the window.
Either you change the size of your application window in the visual studio designer so it fits your personal screen (bad idea), or you make your application aware of window size and window size changes and actively scale parts of the GUI programmatically (better).
If WinForms, as others have stated, you need to Anchor and/or Dock your controls so they know how to resize in relation to the Form when the Form size changes. These will work for simple layouts.
For more complicated needs, however, check out the TableLayoutPanel and/or the FlowLayoutPanel.
A robust User Interface is probably going to be using all of these elements in one way or another...
I've been googling a lot for this one and I can't seem to find anything. Maybe it's the way that I'm wording it. So basically what I'm looking to do in C# using Windows Forms, is create a form and have it essentially take the shape of the taskbar and do the same functions as the taskbar, but it will sit above the task bar or at the top of the screen.
It can't be "ON TOP" (I'm not trying to block user buttons like the close button of a program they are using).
Autohide would be a plus.
This is the main thing I'm after:
It needs to act just like the task bar. When you maximize any other window, the taskbar does not go over the top of the window, even though it is set to "on top".
You'll want to use an Appbar to do this:
http://msdn.microsoft.com/en-us/library/cc144177.aspx
For more information, check out here and here and here.
If you don't want to deal with C++ and Native Code (as #FKunecke correctly proposed) then you'll not find anything predefined for this. What you can do is create a form for your bar and make the visualization calculations by hand, then you can set the screen location of it. That's all. Not forcing the bar form to stay on top will not hide the other app forms so you'll get that for free.
Now, to fully implement what you want there are some problems you need to deal with, such as Taskbar location and height. Then you'll need to use some native code tricks.
I have a form which has only tab control in it. I want to fix the location of the form on windows desktop according to the screen size of the users pc.
The form looks like windows task bar and it should be docked on top of windows desktop.
For this i set dock = top property in my form. But still it is not perfectly on top.
How to over come these melodramatically.
You can use the
Form.DesktopLocation Property
you can use the SHAppBarMessage API (C# definition) to register your form as an application bar. This would properly change the desktop workspace size to ensure other programs don't obscure your app. This approach though requires a bit more work to implement it properly.
If you just want to position yourself at the top, you can also use the Form.DesktopLocation property (as #phoenix also mentioned). You will also have to calculate your size based on the primary monitor size. And if you don't want to be at the primary monitor you will have to do some additional calculations. For these, you will need to use the proper Multiple Display Monitor functions.
Assume i have an empty form 100px by 100px at 0,0 coordinates on the screen. It has no border style. Is there any way to have this positioned BEHIND the desktop icons?
I would assume this would involve the process Progman because thats what contains the desktop icons. But no matter what i try... getting window handles and changing parents etc, i cant seem to get the window to appear behind the icons.
Any ideas?
Essentially you want to draw on the desktop wallpaper. The desktop hierarchy looks like this:
"Program Manager" Progman
"" SHELLDLL_DefView
"FolderView" SysListView32
It's the SysListView32 that actually draws the desktop icons, so that's what you have to hook. And you can't just stick your form on top of it; you have to grab a WindowDC to that handle and draw on the DC.
It can be done - it has been done, but you're going to be using a lot of interop. Forget about doing this with a traditional Winforms Form. I don't think I've even seen it done in C#, although somebody did it in python, if that helps. I'm not a python coder myself, but the code is pretty short and easy to understand.
There is a solution to this problem, at least for Windows 8. I postet it in form of an article on CodeProject, so you can read about it here:
http://www.codeproject.com/Articles/856020/Draw-behind-Desktop-Icons-in-Windows
This works for simple drawing, windows forms, wpf, directx, etc. The solution presented in that article is only for Windows 8.
Google-fu led me to this MSDN forum question:
http://social.msdn.microsoft.com/Forums/en/winformsdesigner/thread/c61d0705-d9ec-436a-b0a6-6ffa0ecec0cc
And this is a blog post regard the major pitfalls with using GetDesktopWindow() or dealing with the desktop handle (as per your other question: C# Position Window On Desktop)
http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx
You also don't want to pass GetDesktopWindow() as your hwndParent. If you create a child window whose parent is GetDesktopWindow(), your window is now glued to the desktop window. If your window then calls something like MessageBox(), well that's a modal dialog, and then the rules above kick in and the desktop gets disabled and the machine is toast.
Anyway, I suspect that it probably CAN be done, but whether you should is another question.