Всъщност намерих начин да направя това (очевидно никой друг не е :/).
За тези, които се чудят, софтуер като "Start8" и "SkipMetroSuite" натиска клавиш за анкета, за да спре Charm Bar. Те буквално симулират натискането на клавиши, за да го затворят в стегнат цикъл.
Намерих (това, което мисля, че е) по-добър начин.
Първо... някои WinAPI функции:
using System.Runtime.InteropServices;
....
private enum WindowShowStyle : uint
{ // find more info at http://stackoverflow.com/a/8210120/1245420
Hide = 0, ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
ShowNormalNoActvate = 4, Show = 5, Minimize = 6, ShowNoActivate = 8,
Restore = 9, ShowDefault = 10, ForceMinimized = 11
}
[DllImport("user32.dll", SetLastError = true)]
static extern System.IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern System.IntPtr FindWindowByCaption(System.IntPtr ZeroOnly, string lpWindowName);
[DllImport("user32.dll")]
static extern bool ShowWindow(System.IntPtr hWnd, WindowShowStyle nCmdShow);
Така че първият проблем е Charm Bar. Заглавието на прозореца за това се оказва Charm Bar
. Създаването на нишка, която непрекъснато търси този прозорец и го скрива, работи прекрасно. Така че създавам нишка и непрекъснато я анкетирам:
System.Threading.Tasks.Task.Factory.StartNew(() => {
while (true) {
System.IntPtr hWndCharmBar = FindWindowByCaption(System.IntPtr.Zero, "Charm Bar");
ShowWindow(hWndCharmBar, 0);
System.Threading.Thread.Sleep(100); // sleep for a bit
}
});
Това работи добре и дава допълнителна полза от това, че Charm Bar продължава да работи, когато приложението е затворено. Thread.Sleep
е там, за да спре нишката, която разбива процесора - но закъснението също така позволява лентата Charm да се появи за част от секундата. Предстои да отворя успешно Charm Bar и да натисна бутон достатъчно бързо, преди нишката да го скрие отново, така че това е добре. Намаляването на времето за сън очевидно прави това по-бързо.
Другият проблем с Windows 8 е, че ако имате някакъв плъзгач (в моето приложение имам ListBox
, съдържащ изображения за галерия), тогава всъщност можете да плъзнете отстрани на екрана... задръжте пръста си там и достъп до лентата на задачите...
И така.. следващата част е затварянето на лентата със задачи:
IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 0);
..след това го показвам отново при затваряне на приложението:
IntPtr hWndTray = FindWindow("Shell_TrayWnd", null);
ShowWindow(hWndTray, 1);
Функционално, това е всичко, което ми трябваше за моето приложение. Надявам се това да помогне на някого.
person
Simon Whitehead
schedule
06.07.2013