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

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

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

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


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

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

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

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

Вроде так и есть, но я в 8ке не могу найти куст, который, судя по форумам, это все хранит. В общем я бы оставил это на откуп пользователя.
...
Рейтинг: 0 / 0
Tray Icon не всегда виден
    #38570406
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Tray Icon не всегда виден
    #38570414
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Tray Icon не всегда виден
    #38570424
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, спасибо. буду разбираться.

больше всего бесит, когда задачи муторные типа таких, а потом говорят, что передумали и нам этого уже не нужно.
...
Рейтинг: 0 / 0
Tray Icon не всегда виден
    #38570430
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Tray Icon не всегда виден
    #38570439
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за помощь! добавлю для 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
Tray Icon не всегда виден
    #38570461
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

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

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

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

http://hianz.wordpress.com/2012/07/13/modify-windows-7-notification-area/
...
Рейтинг: 0 / 0
Tray Icon не всегда виден
    #38571515
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в конце нужно перезапускать 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
19 сообщений из 19, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Tray Icon не всегда виден
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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