2012-12-20 15 views
6

Ich versuche, die Tastendruckereignisse für Win + X auf Windows 8 zu simulieren, die ein kleines Menü auftauchen sollten, aber ich konnte nicht mit SendInput funktionieren. Für jede andere Kombination von Schlüsseln (z. B. Win + R, Win + E, Win + D) funktioniert es, aber nicht für Win + X. Ich habe festgestellt, dass Synergy + das gleiche Problem hat, aber die Windows-Bildschirmtastatur nicht. Ich habe auch die Parameter für SendInput untersucht, die die Bildschirmtastatur verwendet, aber wenn ich in meiner Anwendung genau dieselben Parameter verwende, bekomme ich das Menü immer noch nicht.Win + X, Alt-Tab programmgesteuert drücken

Also meine Frage, wie bekomme ich das zur Arbeit? Oder gibt es eine alternative Möglichkeit, dieses Menü anzuzeigen?

Antwort

3

Ich habe vor kurzem Unterstützung für unsere Anwendung hinzugefügt. Froh, dass wir unseren Konkurrenten dazu schlagen!

Es gibt neue UIPI Einschränkungen in Windows 8. Die am häufigsten verwendete blockierten Verknüpfung ist Alt + Tab, so dass Sie zu wollen, gehen die Abhilfe zu tun.

Sie müssen Ihre Binärdateien mit uiAccess="true" im Manifest markieren. (Weitere Informationen dazu finden Sie unter google.) Dieses Manifest verhindert, dass Binärdateien gestartet werden, sofern sie nicht mit einem von Microsoft genehmigten Codesignaturzertifikat signiert und an einem "sicheren Ort" installiert sind (system32 oder Programme/Programmdateien (x86)). .

Wenn Sie Ihr Programm von einem Helfer aus aufrufen: Die uiAccess-Binärdatei kann nicht mit CreateProcess von einem Medium Integrity-Prozess gestartet werden (das Manifest markiert es als "hohe" Integrität). Stattdessen ist es am einfachsten, es unter Verwendung von ShellExecute "open" zu starten, um die Shell zu erhöhen. Wenn Sie CreateProcessAsUser verwenden, müssen Sie TokenUIAccess auf 1 setzen, indem Sie SetTokenInformation verwenden, sonst schlägt der Start fehl.

Letzte Vorbehalte: Beachten Sie, dass uiAccess ziemlich stark einschränkt, was ein Prozess tun kann. Sie können keine UI-Eingaben von normalen Prozessen (mittlere Integrität) empfangen, sodass andere Anwendungen nicht mit Ihren Fenstern interagieren können. Wenn Sie nicht bereits die bewährten Methoden zum Trennen Ihrer Benutzeroberfläche in einen separaten Prozess befolgen, wäre dies ein guter Grund, dies zu tun. Alternativ können die Aufgaben, die uiAccess erfordern, auch in eine kleine, in sich geschlossene Hilfsbinärdatei eingefügt und vollständig vom Nicht-UI-Prozess getrennt werden. Ihre Haupt-App kann sie als einen Hilfsprozess mit hoher Integrität ausführen, der Anweisungen zur Ausführung dieser spezifischen Aufgaben sendet (z. B. SendInput).

Schließlich wird SendInput funktionieren.

+1

Jetzt bekommen Ihre Mitbewerber hier eine Nachricht. :-) –

+0

Ich bezweifle, dass jemand nur deswegen Programme ändern würde ...;) –

+1

Beachten Sie, dass uiAccess = true das Ziehen und Ablegen von anderen Programmen mit weniger Privilegien verhindern kann. –