Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Tray Icon не всегда виден / 19 сообщений из 19, страница 1 из 1
24.02.2014, 11:28
    #38570200
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Привет всем! Скажите - возможно ли прописать на C#, чтобы мой icon автоматически был всегда виден (как на картинке всегда видны icon звука и icon сетевых подключений ). Icon скайпа виден не всегда (только если нажать на кнопку (см. скриншот)). Я полазил по интернету, но нашёл только как добавить иконку, которая скрывается.
...
Рейтинг: 0 / 0
24.02.2014, 12:16
    #38570280
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
на англоязычных форумах пишут, что это невозможно. Может тут кто-то знает, как можно сделать?
...
Рейтинг: 0 / 0
24.02.2014, 12:45
    #38570337
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

Studentsкак на картинке всегда видны icon звука и icon сетевых подключений

Ничто не запрещает пользователю скрыть их.
...
Рейтинг: 0 / 0
24.02.2014, 12:53
    #38570351
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
да, но мне нужно, чтобы при запуске приложения иконка всегда сначала показывалась по-умолчанию.

Только потом пользователь, кончено, если захочет скрыть её, то пусть скрывает.


Вообще это возможно?
...
Рейтинг: 0 / 0
24.02.2014, 13:12
    #38570376
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
можно настроить в Все элементы панели управления -> Значки области уведомлений

По идее эти настройки хранятся в системе в реестре и необходимо у нужного значка изменить свойство, чтобы он всегда показывался.
...
Рейтинг: 0 / 0
24.02.2014, 13:23
    #38570395
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

А зачем? Мне лично не нравятся приложения, использующие стандартную функиональность нестандартно.

Я лично ВСЕГДА лезу в настройки и по умолчанию убираю почти все иконки из видимости. На текущий момент у меня горят значки аутлука, настройки громкости и пантусвитчер. Все остальные 8 значков заныканы. Представляю, как бы меня взбесило приложение, которое 1) постоянно раздражает глаз 2) да еще и не слушается меня.
...
Рейтинг: 0 / 0
24.02.2014, 13:28
    #38570405
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
[quot Student]По идее эти настройки хранятся в системе в реестре и необходимо у нужного значка изменить свойство, чтобы он всегда показывался. quot]

Вроде так и есть, но я в 8ке не могу найти куст, который, судя по форумам, это все хранит. В общем я бы оставил это на откуп пользователя.
...
Рейтинг: 0 / 0
24.02.2014, 13:29
    #38570406
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Arm79Students,

А зачем? Мне лично не нравятся приложения, использующие стандартную функиональность нестандартно.

Я лично ВСЕГДА лезу в настройки и по умолчанию убираю почти все иконки из видимости. На текущий момент у меня горят значки аутлука, настройки громкости и пантусвитчер. Все остальные 8 значков заныканы. Представляю, как бы меня взбесило приложение, которое 1) постоянно раздражает глаз 2) да еще и не слушается меня.

да, мне тоже.
на работе сказали, что я должен сделать именно так, чтобы показывалось, т.к. так хотят заказчики.

на MSDN написано:

Код: plaintext
When an icon is added to the notification area on Windows 7, it is added to the overflow section of the notification area by default. This area contains notification area icons that are active, but not visible in the notification area. Only the user can promote an icon from the overflow to the notification area, although in certain circumstances the system can temporarily promote an icon into the notification area as a short preview (under one minute).

но по идее информация о настройках для каждого значка хранится где-то. нужно только найти, распарсить и поменять свойство на AlwaysVisible
...
Рейтинг: 0 / 0
24.02.2014, 13:37
    #38570414
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

в реестре. но куст может быть разным для разных версий Windows.

Вот какая-то, не полностью протестированная реализация, найденная вот тут :

Код: 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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
internal bool AlwaysShowNotifyIcon(byte WhenToShow)
{
	// Searches for a notify icon by application path in the registry and updates the key to always show, always hide, or hide when inactive
	// WhenToShow should be 16 (Dec) for always (verified), 17 (dec) for never (I'm guessing on this), and 18 (Dec) for hide when inactive (verified).
	// This will return success status.  Highly suggest putting a local setting variable in to only run this once per machine....
	int x = 0;
	string myHolderString = null;
	System.Text.UTF8Encoding encText = new System.Text.UTF8Encoding();
	try {
		// Get our registry entry
		byte[] myRegistryKeyAsByte = null;
		string myRegistryKeyAsString = "";
		try {
			// Get the registry key
			myRegistryKeyAsByte = ReadCURKByte("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TrayNotify", "IconStreams", null);
			// Convert the bytes to a string of hex values
			for (x = 0; x <= Information.UBound(myRegistryKeyAsByte); x++) {
				myHolderString = DoubleToHex(myRegistryKeyAsByte[x]);
				switch (myHolderString.Length) {
					case 0:
						myRegistryKeyAsString += "00";
						break;
					case 1:
						myRegistryKeyAsString += "0" + myHolderString;
						break;
					case 2:
						myRegistryKeyAsString += myHolderString;
						break;
				}
			}
		} catch (Exception ex) {
			Debug.WriteLine(ex.Message);
		}

		// Get our application path
		byte[] myTempAppPathAsByte = null;
		myTempAppPathAsByte = encText.GetBytes(My.Application.Info.DirectoryPath.ToString + "\\" + My.Application.Info.AssemblyName);
		byte[] myAppPathAsByte = new byte[Information.UBound(myTempAppPathAsByte) * 2 + 1];
		string myAppPathAsString = "";
		try {
			// Add in zeros for every other byte like the registry key has
			for (x = 0; x <= Information.UBound(myAppPathAsByte); x++) {
				if (x % 2 == 0) {
					myAppPathAsByte[x] = myTempAppPathAsByte[Convert.ToInt32(x / 2)];
				} else {
					myAppPathAsByte[x] = 0;
				}
			}
			// Convert the bytes to a string of hex values
			for (x = 0; x <= Information.UBound(myAppPathAsByte); x++) {
				myHolderString = DoubleToHex(myAppPathAsByte[x]);
				switch (myHolderString.Length) {
					case 0:
						myAppPathAsString += "00";
						break;
					case 1:
						myAppPathAsString += "0" + myHolderString;
						break;
					case 2:
						myAppPathAsString += myHolderString;
						break;
				}
			}
		} catch (Exception ex) {
			Debug.WriteLine(ex.Message);
		}

		// Hunt for the application path inside the registry key
		long myPosition = Strings.InStr(myRegistryKeyAsString, myAppPathAsString) - 1;

		if (myPosition > 0) {
			// We found our startup path so make our change to the byte 20 before the start of the path
			// I believe this is the right byte to change from manually setting a icon.  I exported out the TrayIcon 
			// key, changed the value, rebooted, and expored it out again and this byte was the only thing to change
			myRegistryKeyAsByte[Convert.ToInt32(myPosition / 2 - 20)] = WhenToShow;
			// Write the modified key back to the registry
			WriteCURKByteValue("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TrayNotify", "IconStreams", myRegistryKeyAsByte);
			// Now crash explorer.  Thats right....explorer keeps this information in memory and reads it at startup and writes it at shutdown
			// so the only way to actaully change these values is to write to the registry then crash explorer so it can't overwrite what
			// we did.  It will then poll our information when it starts back up.  First look for explorer in memory:
			Process ExplorerProcess = null;
			foreach (Process p in Process.GetProcesses()) {
				if (p.ProcessName.ToString() == "explorer") {
					ExplorerProcess = p;
					break; // TODO: might not be correct. Was : Exit For
				} else {
					ExplorerProcess = null;
				}
			}
			// If we found it then we kill it, it will restart itself
			if ((ExplorerProcess != null)) {
				ExplorerProcess.Kill();
				System.Threading.Thread.Sleep(2000);
			}
		} else {
			return false;
		}

	} catch (Exception ex) {
		Debug.WriteLine(ex.Message);
		return false;
	}

}

private string DoubleToHex(double x)
{
	string functionReturnValue = null;
	functionReturnValue = "";
	double lrem = 0;
	while (x > 0) {
		lrem = x - Conversion.Int(x / 16) * 16;
		functionReturnValue = Conversion.Hex(lrem) + functionReturnValue;
		x = Conversion.Int(x / 16);
	}
	return functionReturnValue;
}



Судя по ней, информация хранится в бинарном потоке)
...
Рейтинг: 0 / 0
24.02.2014, 13:45
    #38570424
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
ясно, спасибо. буду разбираться.

больше всего бесит, когда задачи муторные типа таких, а потом говорят, что передумали и нам этого уже не нужно.
...
Рейтинг: 0 / 0
24.02.2014, 13:49
    #38570430
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

у себя в W8 TrayNotify с заданным свойством я нашел в:
HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify (и, соответственно, в HKEY_LOCAL_MACHINE\Software\Classes)
HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify (и, соответственно, в HKEY_USERS)
...
Рейтинг: 0 / 0
24.02.2014, 13:58
    #38570439
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
спасибо за помощь! добавлю для WIN8

у меня на WIN7 хранится в
HKEY_USERS\S-1-5-21-1889918666-2916935729-2446523582-1000\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify


где S-1-5-21-... - это один из пользователей системы.
...
Рейтинг: 0 / 0
24.02.2014, 14:12
    #38570461
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

вообще-то в W7 путь оказался такой же как в W8 ) Но в приведенном коде путь другой, так что стоит проверить еще XP и Висту.
...
Рейтинг: 0 / 0
24.02.2014, 14:36
    #38570492
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
да, тут проблема бинарный поток распарсить, если тупо вырезать нулевые байты и перевести в строку, то получается абракадабра
...
Рейтинг: 0 / 0
24.02.2014, 15:55
    #38570613
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
да, из-за того, что бинарный файл и непонятно как его парсить (строка - набор букв и цифр), видимо нельзя через регистр поменять.
...
Рейтинг: 0 / 0
24.02.2014, 15:58
    #38570615
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
*то есть через реестр, я опечатался
...
Рейтинг: 0 / 0
24.02.2014, 16:24
    #38570656
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
Students,

ну в примере же как раз и показано как "распарсить" этот поток...
...
Рейтинг: 0 / 0
24.02.2014, 16:32
    #38570670
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
да, всё. спасибо за помощь.

вот код, который парсит поток. может кому пригодится:

http://hianz.wordpress.com/2012/07/13/modify-windows-7-notification-area/
...
Рейтинг: 0 / 0
25.02.2014, 13:14
    #38571515
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tray Icon не всегда виден
в конце нужно перезапускать explorer.exe (получается только если у юзера есть админские права).

можно сделать проще:
Код: c#
1.
2.
3.
int hwnd;
hwnd = FindWindow("Progman", null);
PostMessage(hwnd, /*WM_QUIT*/ 0x12, 0, 0);


таким образом закрывается весь taskbar.

Кто-нибудь знает команду, как его назад включить?
http://www.autohotkey.com/docs/misc/SendMessageList.htm
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Tray Icon не всегда виден / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]