Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/39: Рейтинг темы: голосов - 39, средняя оценка - 4.64
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
1
.NET 4.x

Свой аналог рабочего стола

07.10.2011, 23:52. Просмотров 7283. Ответов 20
Метки нет (Все метки)

Делаю программу аналог рабочего стола.Что-то типа такого,как на скрине,только со своими виджетами и элемента,которые нужны мне.Но при этом я не хочу полностью отказываться от самого explorer.exe.
Потому что я так понял рабочий стол входит в этот исполняемый файл.Если не прав-поправьте меня.
И так суть моего вопроса,как отловить переход на рабочий стол и всегда при этом запускать мой аналог,соответственно без запуска родного.
0
Миниатюры
Свой аналог рабочего стола   Свой аналог рабочего стола   Свой аналог рабочего стола  

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2011, 23:52
Ответы с готовыми решениями:

Сканирование рабочего стола
Кто нить может подсказать код сканирования на файлы. Нужно сканировать рабочий стол, выявить кол-во...

Скрыть ярлыки рабочего стола
Можно сделать так чтоб при запуске программы исчезали все ярлыки рабочего стола?

Изменение заставки рабочего стола
сабж, такое возможно?

Смена обоев рабочего стола
Вопрос вот в чем. Я не силен в Visual Studio. Хочу объединить vbs скрипт и картинку, в один exe...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
20
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
08.10.2011, 00:07  [ТС] 2
Извиняюсь за второй пост!!!Отредактируйте пожалуйста (доходит до утки на вторые сутки)

Я же так понимаю Рабочий стол имеет свой хэндл,т.е. он считается как за окно?!
Т.е. если правильно сейчас мыслю стоит использовать WinAPI.Прога расчитана на XP,хотя думаю и для Win7 тоже добавлю.Вдруг ОСь переустановлю.
Если WinAPI - то я не знаю только как это окно зовётся,как его искать и как перехватывать обращение к нему - я же должен успеть включить свою прогу до появления рабочего стола,чтобы всякого рода мерцания не было.
0
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
08.10.2011, 00:18 3
Лучший ответ Сообщение было отмечено как решение

Решение

Dj_SheLL, так сами же ответили на свой вопрос - explorer.exe и есть рабочий стол. Дропните/замените исполняемый файл на свой и будет вам счастье. Только там может возникнуть трабла с тем, что Windows XP попросит вставить диск и восстановить файл - не помню как от этого избавится.
К примеру, если убить процесс explorer, то останутся только обои. Я в свое время вообще от него избавился - так как он мне мешал.
Рабочий стол, он же explorer, - обычное приложение.
P.S. Не знаю и знать не хочу, что там у Windows 7 - наверняка тоже самое.
3
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
08.10.2011, 12:47  [ТС] 4
Но я не хочу отказываться от самого Explorer.Свой explorer ещё в догонку писать очень непрактично и накладно,так как там много чего нужно учесть.
Я хочу только перехватывать сам переход на рабочий стол.Сейчас пока шарюсь на google,может что найду(отпишусь)...
0
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
10.10.2011, 15:21 5
Dj_SheLL, раньше создавал тоже аналог рабочего стола. Советую разобраться сперва как всё реализовано в Cairo Shell, т.к. сам Shell написан именно на C# (правда не на WinForms).
Могу посоветовать 1 метод что бы при включении компьютера твой рабочий стол запускался, а стандартный убирался. Создай bat-файл в него впиши:



ActionScript 3
1
2
taskkill /f /im explorer.exe
taskkill /f /im sidebar.exe
Теперь в обработчике событий при запуске формы впиши:

C#
1
Process.Start(@"путь_к_батнику");

Наконец последняя стадия:
* в автозапуск добавь твою программу (после перезапуска твой рабочий стол будет запускаться, а стандартный не будет ничем мешать)

P.S. Так же советую сделать возврат к стандартному рабочему столу. Для этого сделай в менюшке кнопочку (или просто виджет на рабочем столе) по нажатию которой будет происходить:

Proces.Start("explorer.exe");
this.Dispose();
2
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
10.10.2011, 21:04  [ТС] 6
Цитата Сообщение от hitmen047 Посмотреть сообщение
Советую разобраться сперва как всё реализовано в Cairo Shell, т.к. сам Shell написан именно на C# (правда не на WinForms)
Огромное спасибо за ссылку!!Там и исходники есть.Ещё не качал,просто полистал,понял,что на WPF.Ну я не ищу лёгких путей.
Но Cairo крутая вещь!

Цитата Сообщение от hitmen047 Посмотреть сообщение
Могу посоветовать 1 метод что бы при включении компьютера твой рабочий стол запускался, а стандартный убирался.
Ну у меня пока в планах вообще его не убирать.Свой проводник накладно писать.
Просто сделаю своё приложение "дочкой" рабочего стола и буду с него как раз инфу таскать.Ну и конечно буду перехватывать попытки перехода на стандартный рабочий стол и адресовать на мою программу.

Большое спасибо за "пищу" для мозгов!Пригодится!!!
0
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
10.10.2011, 22:44 7
Dj_SheLL, проводник можно и другим образом вызывать Не только через explorer.exe

Попробуй закрыть explorer.exe и создать программу с кнопкой, при нажатии на которую будет происходить следующее (в Win 7 открывается проводник, не рабочий стол. В WinXP возможно, что рабочий стол запустится и откроется проводник):

Process
.Start("::{20d04fe0-3aea-1069-a2d8-08002b30309d}");

1
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
10.10.2011, 23:09  [ТС] 8
Цитата Сообщение от hitmen047 Посмотреть сообщение
Dj_SheLL, проводник можно и другим образом вызывать Не только через explorer.exe

Попробуй закрыть explorer.exe и создать программу с кнопкой, при нажатии на которую будет происходить следующее (в Win 7 открывается проводник, не рабочий стол. В WinXP возможно, что рабочий стол запустится и откроется проводник):

Process
.Start("::{20d04fe0-3aea-1069-a2d8-08002b30309d}");

Спасибо за наводку!!!Нашёл даже проще!
Можно explorer запускать с параметром папки и т.п.
Вот тут есть сборка команд,уже пару проверил,работает

Единственная фигня то,что при выполнении команды допустим "Explorer /Root,C:" explorer.exe уже должен быть запущен.
1
18 / 18 / 3
Регистрация: 16.02.2010
Сообщений: 243
11.10.2011, 19:21 9
Тоже всегда хотел такое написать, как Cairo. Но в нём что-то много всего, подскажите как сделать чтобы другие окна при разворачивании не закрывали менюБар?
P.S. сори если оффтоп, но по моему по теме
0
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
11.10.2011, 20:44  [ТС] 10
Цитата Сообщение от -=G-L-A-V-A-K=- Посмотреть сообщение
Но в нём что-то много всего
Ну говорят 70 метров.Хотя я прикинул,если я буду на WinForms делать,то так много вообще не получается.Даже если брать весь функционал.Это что ж туда надо было напихать...
Цитата Сообщение от -=G-L-A-V-A-K=- Посмотреть сообщение
подскажите как сделать чтобы другие окна при разворачивании не закрывали менюБар?
Поподробнее,не понятно.
0
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
12.10.2011, 00:29 11
-=G-L-A-V-A-K=-, как я понял, ты хочешь видеть TaskBar Windows (его не видно, если стиль формы без всего, кроме рабочей области, не помню названия)? Рассчитай размер экрана и вычитай 36 по оси Y (вроде такое значение).
Про рассчёт размера экрана есть в гугле и на этом форуме.
0
18 / 18 / 3
Регистрация: 16.02.2010
Сообщений: 243
12.10.2011, 13:19 12
Dj_SheLL, Если просто сделать форму(аналог панели задач) топмост, то при разворачивании другого окна оно окажется под ней, а мне надо чтобы она была чуть правее
0
18 / 18 / 3
Регистрация: 16.02.2010
Сообщений: 243
12.10.2011, 13:27 13
Вроде понятно нарисовал...
0
Миниатюры
Свой аналог рабочего стола  
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
12.10.2011, 14:38 14
Цитата Сообщение от -=G-L-A-V-A-K=- Посмотреть сообщение
Dj_SheLL, Если просто сделать форму(аналог панели задач) топмост, то при разворачивании другого окна оно окажется под ней, а мне надо чтобы она была чуть правее
Высота формы большая для замены панели задач. Тут придётся скорее всего с WinAPI поработать.
0
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
12.10.2011, 18:02  [ТС] 15
Цитата Сообщение от hitmen047 Посмотреть сообщение
Высота формы большая для замены панели задач. Тут придётся скорее всего с WinAPI поработать.
Не скорее всего,а точно.На Delphi делал вчера буквально.Скрываешь панель задач и ставишь своё приложение.
На XP проблем с скрытием не будет.По поводу Vista не знаю,а вот на Win7 панель задач скрывается,а вот читал на форумах косяки с кнопкой Пуск.
0
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
18.10.2011, 15:32 16
Dj_SheLL, Delphi в плане работы с WinAPI проще. Поэтому человеку можно просто посоветовать выставить фиксированое значение высоты для панели задач, если он с WinAPI не захочет играться. (36 dpx вроде, т.е. в дизайнере формы надо выставить height 36)
0
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
18.10.2011, 21:56  [ТС] 17
А я на WinApi убирал.На pinvoke.net есть описание всех WinAPI функций.Некоторые немного косячные описание,но что-то всё таки есть.
И на XP я пробовал.При классической теме получалось не 36,а 30.Наверное тогда лучше узнавать высоту таскбара.Опять же нужен WinAPI.
0
Местный Ёжидзе
42 / 42 / 4
Регистрация: 03.03.2010
Сообщений: 225
19.10.2011, 14:43 18
Dj_SheLL, в Win 7 на 6 dpx больше надо брать.


Цитата Сообщение от Dj_SheLL Посмотреть сообщение
Наверное тогда лучше узнавать высоту таскбара.Опять же нужен WinAPI.
Не обязательно. Можно программно узнать версию Win и исходя из этого уже подгонять высоту. Если не ошибаюсь, то в Vista, как и в XP 30 dpx занимает панель задач. В Win 7 36 dpx.
0
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
21.10.2011, 00:49  [ТС] 19
Я решил всё таки сделать по уму.Нашёл примерчик и отредактировал под свои нужды для WPF.Пользуемся если надо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[DllImport("shell32.dll", SetLastError = true)]
        public static extern IntPtr SHAppBarMessage(ABM dwMessage, [In] ref APPBARDATA pData);
 
[DllImport("User32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
public enum TaskbarPosition
        { Unknown = -1, Left, Top, Right, Bottom, }
 
        public sealed class Taskbar
        {
            private const string ClassName = "Shell_TrayWnd";
 
            public Int32 dataLeft
            { get; private set; }
 
            public Int32 dataTop
            { get; private set; }
 
            public Int32 dataRight
            { get; private set; }
 
            public Int32 dataBottom
            { get; private set; }
 
            public Taskbar()
            {
                IntPtr taskbarHandle = FindWindow(Taskbar.ClassName, null);
                APPBARDATA data = new APPBARDATA() { cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)), hWnd = taskbarHandle };
                IntPtr result = SHAppBarMessage(ABM.GetTaskbarPos, ref data);
                if (result == IntPtr.Zero) throw new InvalidOperationException();
 
                dataLeft = data.rc.left;
                dataRight = data.rc.right;
                dataBottom = data.rc.bottom;
                dataTop = data.rc.top;
            }
        }
 
        public enum ABM : uint
        { GetTaskbarPos = 0x00000005,}
 
        public enum ABE : uint
        {
            Left = 0,
            Top = 1,
            Right = 2,
            Bottom = 3
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct APPBARDATA
        {
            public uint cbSize;
            public IntPtr hWnd;
            public uint uCallbackMessage;
            public ABE uEdge;
            public RECT rc;
            public int lParam;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }
и по кнопочке смотрим размеры (т.е. положение taskbar-а)
C#
1
2
Taskbar taskbar = new Taskbar();
            MessageBox.Show(String.Format("{0} {1} {2} {3}", taskbar.dataBottom, taskbar.dataLeft, taskbar.dataRight, taskbar.dataTop));
0
179 / 84 / 10
Регистрация: 13.02.2010
Сообщений: 317
23.10.2011, 11:20  [ТС] 20
Вопрос на засыпку!!!
А как сделать,чтобы мой "рабочий стол" загружался раньше дефолтного?!
Где-то же хранится порядок загрузки в автозагрузке? Только я нигде не нашёл где
Может кто знает?!

P.S. WPF - это сила! Я прозрел! WinForms - детский лепет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2011, 11:20

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Обработка изображения рабочего стола
Всем доброго времени суток. По задаче для начала нам необходимо получить скрин с экрана, после...

Как определить hwnd рабочего стола?
Как определить hwnd рабочего стола? Добавлено через 2 часа 22 минуты решено. через спай пробил...

Скриншот рабочего стола удаленной машины.
Только начал изучать С#, прошу вашей помощи. Возможно ли получить скриншот рабочего стола...

Как программно сменить фон рабочего стола
Как программно сменить фон рабочего стола? P.S. Windows 7


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.