ExitWindowsEx i Metro App

ExitWindowsEx i Metro App
R2
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 13 lat
  • Postów:54
0

Witam,

Walczę z MetroUI. Ponieważ, jak wielu, nie mogę się przyzwyczaić do nowego sposobu wyłączania Windows 8, postanowiłem napisać sobie program dla Metro, który po włączeniu będzie miał trzy przyciski: "Wyłącz", "Restartuj", "Uśpij". W życiu nie podejrzewałem, że będzie to takie trudne...
Z powodu wszelakich ograniczeń jakie M$ zastosował do metro (paranoja...) stwierdziłem, że aby tego dokonać najłatwiej będzie zrobić nową zwykłą C#-ową DLL, która będzie wywoływać ExitWindowsEx i wywołać ją z aplikacji Metro.
Dowiedziawszy się, że nie może to być po prostu dołączona nowa referencja, a musi być to DLL załączony do projektu, z właściwością Build Action: Content i potem jakoś magicznie wywołany, po kolejnym namyśle stwierdziłem, że najłatwiej będzie zastosować reflection (wtedy jeszcze nie wiedziałem, że zaszły tam takie zmiany...).
Do sedna - spłodziłem genialną DLL:

Kopiuj
public static class Library
{
    [DllImport("User32.dll")]
    public static extern int ExitWindowsEx(int uFlags, int dwReason);

    [DllImport("Kernel32.dll")]
    public static extern int GetLastError();    

    public static string MsgBox()
    {
        return "Dupa";
    }

    public static int TurnOff()
    {
        return ExitWindowsEx(2, 0);
    }

    public static int Error()
    {
        return GetLastError();
    }
}

Jej wywołanie w Metro wygląda następująco:

Kopiuj
            AssemblyName name = new AssemblyName("TurnOffLibrary");
            Assembly ass = Assembly.Load(name);
            TypeInfo ti = ass.DefinedTypes.ElementAt(0);

            MethodInfo msgbox = ti.GetDeclaredMethod("MsgBox");
            object dupa = msgbox.Invoke(ti, null);

            if (dupa is string)
            {
                pageTitle.Text = (dupa as string);
            }

            MethodInfo turnoff = ti.GetDeclaredMethod("TurnOff");
            int return1 = (int)turnoff.Invoke(ti, null);

            MethodInfo error = ti.GetDeclaredMethod("Error");
            int return2 = (int)error.Invoke(ti, null);

I teraz:
return1 posiada wartość 0 (słownie: zero)
return2 posiada wartość 5 (słownie: pięć) - Access Denied

pageTitle otrzymuje napis "Dupa" bez problemu, więc DLL się wykonuje, ale nie ma żadnej reakcji na ExitWindowsEx. Mogę ją wywoływać z różnymi parametrami i nic się nie stanie.

Przed napisaniem tej library próbowałem bezpośredniego Invoka w MetroApp bez używania zew. DLL, ale efekt był ten sam. Po prostu to wygląda tak jak by M$ się zawziął i wyciął wszelkie sposoby na wyłączenie Windows z menu start... pfuuuu z MetroUI.

Czy da się to zrobić jakoś inaczej?

Bartosz Wójcik
odpal z prawami admina tą appkę i wtedy sprawdź
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
0

Bardzo prosta sprawa - kwestia zabezpieczeń. Powiedziałbym, że to bardzo dobrze, że się nic nie dzieje, bo próbowałeś oszukać zabezpieczenie :).

Stwórz WinRT Component DLL w C++/CX (dzięki tym rozszerzeniom oraz nowym metadanom nie musisz po stronie C# bawić się w żadne interopy). Możesz w nich zrobić co się podoba (a na co użytkownik lokalny ma uprawnienia). Po to wprowadzono to rozróżnienie, bo zmienia się kwestia dystrybucji aplikacji z tego typu komponentami.

edytowany 2x, ostatnio: Rev
R2
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 13 lat
  • Postów:54
0

Sporo poczytałem o WinRT. Nie trzeba tworzyć WinRT Component DLL, żeby mieć dostęp do metod WinRT. Są spokojnie dostępne w MetroApp. Jednak niestety wygląda na to, że WinRT nie potrafi wyłączyć, zrestartować czy nawet wylogować użytkownika... A szkoda. Za bardzo wiążą ręce programistom.

Azarien
oby całe to metro i winrt okazało się katastrofą.
OT
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 11 lat
0

Nie wiem jak jest w Win8, ale twój kod nie zadziałałby nawet pod xp, też z powodu braku uprawnień, niewazne z jakiego użytkownika działasz. Powinieneś najpierw użyć AdjustTokenPrivileges i ustawić odpowiednie uprawnienia dla twojego procesu, inaczej zawsze dostaniesz Acces Denied w każdym windowsie z serii nt i nowszym.

Tu masz przykład jak prawidłowo użyć ExitWindowsEx:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376871%28v=vs.85%29.aspx

Według mnie to może byc problemem, a nie WinRT.

edytowany 1x, ostatnio: othello
R2
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 13 lat
  • Postów:54
0

Obok miałem WinForms App na której równolegle testowałem dll i w niej działało OK.
Mimo wszystko poszedłem za radą i zmodyfikowałem klasę. Zwrot z GetLastError po modyfikacji dostałem 0. A więc jak by pomogło w tym względzie, ale dalej brak reakcji ze strony PC. Na szybko użyłem też tej metody: http://stackoverflow.com/questions/4841654/c-sharp-shutdown-hibernate-sleep
Wywołanie funkcji z WinForms pięknie wyłączyło mi PC. Wywołanie z metro skutkuje System.Reflection.TargetInvocationException - Exception has been thrown by the target of an invocation. Inner Exception: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)":null
Cały kod w funkcji był zamknięty w Try-Catch wew. dll i tam nie został złapany żaden wyjątek.

Moim zdaniem nie da się i już. MS założył, że metro ma wyglądać ślicznie, służyć do wyświetlania pogody, programów telewizyjnych i innych informacji i to wszystko na co pozwala programistom.

edytowany 3x, ostatnio: rychu22
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

Spróbuj napisać temat o tym na forum codeguru.pl. Oni tam siedzą dużo w samym .net i niekiedy jak tutaj nie udało mi się znaleźć porady to tam ją znajdywałem.

GR
"Znajdywałem". Słowo do automatycznego poprawiania.
OT
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 11 lat
1

Najwięcej wiedzą na cytowanym już przez ciebie stackowerflow, ja bym pytał tam (oczywiście jeśli znasz angielski). Sam pytałem tam nie raz o tak "niepopularne" rzeczy, że nawet tutaj znalazłyby się może ze 2-3 osoby, które się zetknęły z tym samym problemem albo w ogóle mieli podobne zadanie przed sobą - nigdy nie zdarzyło mi się nie uzyskać co najmniej kilku wartościowych odpowiedzi.

Napisanie na forum msdn, czyli u źródła (oczywiście także po angielsku) też nie jest złym pomysłem - w końcu to tam siedzą spece od technologii MS, a nieraz i sami programiści MS zaglądają.

Licząc na same polskojęzyczne fora ograniczasz mniej więcej o 95%, warto o tym pamiętać - to tak samo jak szukanie materiałów w google tylko po polsku.

edytowany 3x, ostatnio: othello
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)