2011-09-14 20 views
7

Genel olarak klavye girdisini yakalayan bir Windows uygulaması yapıyorum. Bir kullanıcı CTRL + ALT + G kısayol combo kullandığında uygulama odakta ne olursa olsun metin alanı içine GUID olarak oluşturulmuş yazmak içinNeden SendKey.Send() sadece bir süre çalışır?

SendKey.Send(Guid.NewGuid().ToString()); 

kullanır. Ve girdiyi alan uygulamadan bağımsız olarak bunu yapmalıdır.

Sana CTRL + ALT + G'ye ama sonraki girişimler hiçbir şey, ya da sadece çok seyrek başarılara neden ilk defa istendiği gibi Tam olarak çalışır.

Her şey çok basit ve tutarlı olmalı. Sürekli çalışan bir klavye klavyem var, bunu test ettim, ancak SendKey.Send() yöntemi her zaman çalışmıyor.

Sorunumla ilgili herhangi bir şeye Google'ın her yerinde baktım, ancak şu ana kadar hiçbir şey işe yaramadı.

Herhangi bir fikir sahibi olan var mı?

EDIT 1: SendKey.SendWait() kullanmayı denedim, aynı şeyi yapar. Bu klavye kısayol yaklaşımını kullanarak yeni GUID oluşturmak için daha duyarlı bir yol istiyorum.

DÜZENLEME 2: Projemdeki başka

void hook_KeyPressed(object sender, KeyPressedEventArgs e) 
{ 
    SendKeys.SendWait(Guid.NewGuid().ToString()); 
} 

Her şey sadece geçerli:

/* Initialization Code Here */ 
// register the event that is fired after the key press. 
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(hook_KeyPressed); 
// register the control + alt + F12 combination as hot key. 
hook.RegisterHotKey((uint)(HotkeyModifiers.Control | HotkeyModifiers.Alt), Keys.G); 

olay kodu oldukça basittir: Aşağıda

kod gerekli parçaları olan kabartmak.

Güncelleme 1:

Bu konu hakkında daha fazla soru var, ama bugün için bu konuda çalışmaya devam etmek zaman yokum. Jon Raynor'ın app.config yaklaşımını bir dereceye kadar kullanma önerisini hayata geçirdim. Yeni problemlerimi bir kez kestirdiğimde, bir düzenlemeyi yayınlayacağım ve uygulamanın amacına uygun şekilde çalışmasını sağlayacağım.

+0

Genel olarak klavye girişini yakalayarak ne demek istiyorsunuz? Bunu yapıyorsanız, aynı zamanda GUID'yi aldığınız anlamına da gelmez. Kesinlikle RegisterHotKey istiyorum. –

+0

Bu proje için RegisterHotKey pinvoke kullanıyorum. Kısayol tuşlarını yakalamak kolaydır, sorun SendKey.Send() yöntemindedir. – LamdaComplex

+0

Kodunuzda SendKey.Send'i mi çağırıyorsunuz? –

cevap

7

Zamanlama sorunlarıyla karşılaşıyor olabilirsiniz. MSDN documentation göre:

SendKeys sınıfı .NET Framework için güncellendi 3.0 Windows Vista üzerinde çalışan uygulamalarda kullanımını sağlar. Windows Vista'nın (Kullanıcı Hesabı Denetimi veya UAC) olarak bilinen geliştirilmiş güvenliği, önceki uygulamanın beklendiği gibi çalışmasını engeller.

SendKeys sınıfı bazı geliştiriciler geçici zorunda zamanlama sorunları, karşı hassastır. Güncelleştirilmiş uygulama, zamanlama sorunlarına hala duyarlı olan 'dir, ancak biraz daha hızlıdır ve geçici çözümlerde olabilir. SendKeys sınıfı, bir önceki uygulamada kullanmayı dener ve bu başarısız olursa, yeni uygulamasını kullanır. Sonuç olarak, SendKeys sınıfı farklı işletim sistemlerinde farklı şekilde davranabilir.Ayrıca, SendKeys sınıfı yeni uygulamayı kullandığında, SendWait yöntemi başka bir işleme gönderildiğinde iletilerinin işlenmesini beklemez. Başvurunuz bakılmaksızın işletim sisteminin tutarlı davranışı dayanıyorsa

, kendi app.config dosyasında aşağıdaki uygulama ayarı ekleyerek yeni uygulanmasını kullanmaya SendKeys sınıfının zorlayabilir.

<appSettings> 

<add key="SendKeys" value="SendInput"/> 

</appSettings> 

, önceki uygulamayı kullanacaktır yerine değeri "JournalHook" kullanmaya SendKeys sınıfının zorlamak için.

+0

Cevabınız için teşekkür ederiz. Beni doğru yöne soktu. Bu bana MSDN belgelerini daha dikkatli okumam gerektiğini öğretti. Uygulamamla ilgili sorunlar yaşamaya devam ediyorum ancak diğer sorunların sonucu olabilirler. Sorunu izole edersem bu soruyu güncelleyebilirim. – LamdaComplex

1

Bu, tam olarak sorununuzu ele almayacaktır, ancak alternatif bir yaklaşımdır. Daha önce yönetilen koddaki genel anahtar kancaları denedim. Bu bir acı. Hokey ve ilkel olduğu gibi, ben AutoHotKey'u seviyorum. Bununla gerçekten çok güçlü şeyler yapabilirsin.

Burada, Ctrl + Alt + G'yi global olarak çırpma ve bir kılavuz yazarak gereksiniminizi karşılayan bir örnek var. En iyi bölüm, satır içi C# derler, böylece hala System.Guid.NewGuid()'u kullanabilirsiniz. Çalışan bir senaryonuz varsa, bir exe'a derleyebilirsiniz, böylece AutoHotKey yüklü olmayan birisi onu çalıştırabilir.

#NoEnv 
#SingleInstance 
#Include CLR.ahk 
#Include COM.ahk 

;minimize delay between key presses 
SetKeyDelay, -1 

;create c# code 
CLR_Start() 
_g := CLR_CompileC#("class c{public string GetNewGuid(){return System.Guid.NewGuid().ToString();}}", "System.dll").CreateInstance("c") 

;hook keyboard ctrl+alt+g 
^!g::InsertGuid() 

;generate a guid and type it 
InsertGuid() { 
    global 
    local guid := _g.GetNewGuid() 
    Send,%guid% 
} 

sen de denemek ardından iki ekstra komut here ve here indirmek AutoHotKey_L yüklemek istiyorsanız.

+0

Sizin gibi, bu deney, özellikle ne kadar kolay olması gerektiği göz önüne alındığında, hayal kırıklığından başka bir şey getirmedi. Ama sonra tekrar, geleneksel kısayol komutlarının Windows'da nasıl uygulandığı hakkında çok az şey biliyorum. AutoHotKey çözümünüzü deneyeceğim ve bu soruyu yakında güncelleyeceğim. – LamdaComplex

İlgili konular