2012-12-20 16 views
6

Próbuję symulować zdarzenia keypress dla Win + X na Windows 8, które powinny wyskoczyć małe menu, ale nie byłem w stanie uruchomić tego przy użyciu SendInput. Dla każdej innej kombinacji kluczy (np. Win + R, Win + E, Win + D) działa, ale nie dla Win + X. Zauważyłem, że Synergy + ma ten sam problem, ale klawiatura ekranowa Windows tego nie robi. Przyjrzałem się także parametrom SendInput, z których korzysta klawiatura ekranowa, ale jeśli używam dokładnie tych samych parametrów w mojej aplikacji, nadal nie otrzymuję menu.Naciśnięcie klawisza Win + X, Alt-Tab programowo

Więc moje pytanie, jak mam to uruchomić? Czy istnieje alternatywny sposób wyświetlania tego menu?

Odpowiedz

3

Ostatnio dodałem do tego wsparcie dla naszej aplikacji. Cieszę się, że pokonaliśmy naszego konkurenta!

Są nowe ograniczenia UIPI w Windows 8. Najczęściej stosowane zablokowane skrótu Alt + Tab, więc będziesz chciał zrobić obejścia.

Musisz oznaczyć swoje pliki binarne w uiAccess="true" w manifeście. (Aby uzyskać więcej informacji o tym, jak to zrobić, google.) Ten manifest uniemożliwia uruchomienie plików binarnych, chyba że jest podpisany za pomocą certyfikatu podpisującego kod i zatwierdzony przez Microsoft i zainstalowany w "bezpiecznej lokalizacji" (system32 lub Program Files/Program Files (x86)) .

Jeśli zainstalujesz swój program z poziomu dowolnego pomocnika: Plik binarny uiAccess nie może zostać uruchomiony z CreateProcess z procesu średniej integralności (manifest oznacza, że ​​wymaga "wysokiej" integralności). Zamiast tego najłatwiej jest uruchomić go przy użyciu "otwartego" ShellExecute, aby uzyskać możliwość podniesienia powłoki. Jeśli używasz CreateProcessAsUser, musisz ustawić TokenUIAccess na 1 używając SetTokenInformation, inaczej uruchomienie nie powiedzie się.

Obowiązki końcowe: należy zauważyć, że uiAccess dość mocno ogranicza to, co proces może zrobić. Nie można odbierać danych wejściowych interfejsu użytkownika z procesów normalnej (średniej integralności), więc inne aplikacje nie mogą wchodzić w interakcje z oknami. Jeśli nie stosujesz już dobrych praktyk w zakresie oddzielania interfejsu użytkownika w oddzielny proces, jest to dobry powód, aby to zrobić. Alternatywnie, zadania wymagające uiAccess mogą zostać umieszczone w małym, samodzielnym binarnym pomocniku i całkowicie oddzielone od procesu, który nie jest również obsługiwany przez użytkownika. Twoja główna aplikacja może działać jako proces pomocniczy o wysokiej integralności, który wysyła instrukcje wymagane do wykonania tych konkretnych zadań (takich jak SendInput).

Wreszcie zadziała SendInput.

+1

Teraz twoi konkurenci dostają się tutaj. :-) –

+0

Wątpię, by ktokolwiek zmieniał programy właśnie z tego powodu;) –

+1

Należy pamiętać, że funkcja uiAccess = true może zapobiec przeciągnięciu i upuszczeniu z innych programów z mniejszymi uprawnieniami. –

Powiązane problemy