2011-04-20 15 views
5

Eski bir uygulamaya işlevsellik eklemek isteyen bir müşteri ile çalışıyorum. Satıcısı işe yaramaz olan uygulamanın bir Windows Forms UI'si var. Müşterimin istediği şey, kullanıcı uygulamadaki bir bilgi parçasını tıkladığında bu uygulamanın dışındaki belirli işlevler için tetiklenir.Tuş vuruşlarını ve fare tıklamalarını diğer uygulamalara kesip geçiren bir Windows uygulamasını nasıl oluşturabilirim?

Bunun başka bir müşteri için yapılan basit bir sürümünü gördüm. Bu durumda, SetWindowPos kullanarak en üstteki pencereye ayarlanmış bir formdan oluşan bir uygulama var. Kullanıcı bu formdaki bir düğmeyi tıkladığında, uygulama eski uygulama penceresini bulur ve pencerenin altyazısından bilgi alır. Bu hiç de belirsiz - eski uygulama açık olmasa bile asla geçmeyen bu yüzen düğme var - ama çalışıyor.

Topmost özellik kümesinde kenarlıksız şeffaf bir WPF penceresi kullanarak buna benzer bir şey yapmanın mümkün olup olmayacağını merak ediyordum. Düşünüyorum uygulama eski uygulama penceresindeki içeriği analiz eder ve sıcak noktalar listesi tanımlar. Bir hotspotta herhangi bir fare tıklığını tutacak ve tutacak ve kalan tüm fare tıklamalarını eski uygulamaya geçirecek.

Windows API ile deneyimlemedim, bu yüzden bu tür bir yeteneğin uygulanmasının (hatta) mümkün olup olmadığını bilmiyorum. Ve anti-malware araçları yazıyor olsaydım, akılda tuttuğum uygulama tam olarak sakatlanmaya çalışacağım türden bir şeydi.

Bu aslında uygulanabilir bir proje ise, bunu yapmanın en iyi yolu nedir? Hangi beklenmedik problemlere bakmalıyım?

cevap

3

Bu, WH_CALLWNDPROC ve/veya WH_GETMESSAGE kancaları aracılığıyla üst üste binme düğmeli herhangi bir hileye gerek kalmadan yapılabilir. davids öneriye

0

Ve alternatif yöntem uygulamaları pencere proc kanca GetWindowLong, SetWindowLong ve CallWindowProc kullanmaktır imo onun yöntemini 'çengel pencereleri' kullanmaktan daha biraz daha basit ama yine de bu yöntemle bağımlısı olabilir ve/veya tekrar alt sınıf. kısa bir örnek için msdn'de bir pencerenin alt sınıfını görmek için bkz: http://msdn.microsoft.com/en-us/library/ms633570(v=vs.85).aspx#subclassing_window

+1

Uygulamadaki tüm pencereleri zahmetli olan alt sınıflara ayırmanız gerekir. –

+0

@david: Sadece yüksek seviyeli pencereleri alt sınıflara ayırmanız yeterlidir, bu da op'un sorusunu nasıl okuduğumla ilgili olarak, sadece alt pencerelere ihtiyaç duyan 1 – Necrolis

+0

alt sınıfına gereksinim vardır. –

1

Kesinlikle UI Automation'u deneyebilirim. Çalışmayabilir, ama en azından denemesi oldukça kolay olmalı. Ve çoğu zaman, işe yaramazsa, başka bir “kolay” yolun olmayacağı anlamına gelir.

UI Automation, sahip olmadığımız uygulamalarla çoğu zaman yapmak istediğimiz engelli kişiler için destekleyici teknolojilerdeki kökünü bulur: gerçekten bir şey yapmadan, harici bir uygulamadan şeyler yapmak " standart yol ". Bence UI Automation Events Overview

+0

David'in çözümü işe yarayacak olsa da, UIAutomation'ı denemenin çok ilginç olduğunu düşünüyorum. –

+0

Güvenlik, sistemde nasıl çalıştığına bağlıdır. Çalışan kullanıcının yönetici veya belirli hakları yoksa, David'in çözümünün işe yarayacağını düşünmüyorum.Ve belki UI otomasyon, BTW ile aynı. –

+0

UIAutomation burada uygun değil: olaylar kavramına sahip, ancak bunlar asenkron, pasif ve UI düzeyinde değil, giriş değil: UI'de neler olduğunu anlatıyorlar (örneğin, bir liste öğesi seçildi)); ancak bu fareyi veya klavye girişini anlatmak için onları kullanamazsınız, bunları değiştiremez/değiştiremezsiniz. Yani UI izlemek için harika; ama filtrelemek/girişi durdurmak için değil. – BrendanMcK

1

Subclassing aradığınız budur:

It da mantıksal olarak burada Officiel belgeye bakın, olayların kavramı vardır.

Bir Windows uygulaması oluşturulduğunda, bir Pencere oluşturur ve daha sonra bu pencereye alt Windows ekler (alt pencereler Denetimler olarak bilinir ve Windows gibi EXACTLY olarak davranır! Düğmeler, metin alanları vb. Olabilirler ...).

Her pencerede bir Pencere yordamı vardır ve bir kullanıcı/program pencerenizle her etkileşimde bulunduğunda, pencere yordamınız etkileşim hakkında bilgi içeren bir ileti alır.Çoğu zaman, kontroller bir pencere prosedürünü ebeveynleriyle ve bu pencere prosedürü ile paylaşacak, kod, mesajın tanımladığı pencerenin/kontrolün ID'sine (hwnd) bağlı olarak ne yapılacağını belirler - yani: 'click' mesajı çıkış butonu kontrolünü açıklarsa 'click' mesajı ana pencereyi açıklarsa hiçbir şey yapmayın.

Windows hakkında daha fazla bilgi edinmek için burayı bakmak için: http://msdn.microsoft.com/en-us/library/aa383738%28v=vs.85%29.aspx

Subclassing müdahale ve/veya başka bir Window prosedürü için gönderilen mesajları yakalama sürecidir. Genellikle üçüncü taraf uygulamalarının kontrolleri ve pencerelerinin davranışını genişletmenin bir yolu olarak hizmet eder. DLL, GetWindowLong(), SetWindowLong(), CallWindowProcedure() ve kendi özel pencere yordamınızı kullanarak başka bir işlemi alt sınıflamak mümkündür. Oldukça kolay - burada bunu yaparken hakkında gitmek istiyorum nasıl:

  • önceki pencere yordamı alın ve saklayın FindWindow()
  • kullanarak alt sınıf isteyen hedef pencereyi bulun. WNDPROC wpOrigEditProc = GetWindowLong(hTargetWnd, GWL_WNDPROC)

  • kendinizinkilerle pencere yordamı üzerine yazın. SetWindowLong(hTargetWnd, GWL_WNDPROC, HookWndProcedure);

Sonra kaldırırken, yine eski pencere yordamı geri yükleyin. Pencere prosedürü, tüm sihrin gerçekleşecek. Bu işlevin içinde hangi iletileri işlemek istediğinize ve hangi pencerelere aktarmak istediğinize eski pencere prosedürüne karar verebilirsiniz. İşte bir örnek pencere işlemdir:

LRESULT APIENTRY HookWndProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    if(hwnd == hTargetWndButton_OK) { 
     // This is the button we wish to intercept... do some processing, then send it back to Windows 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } else { 
     // Allow the message to pass through to the original application's window procedure. 
     return CallWindowProc(wpOrigEditProc, hwnd, uMsg, 
      wParam, lParam); 
    } 
} 

`

hile, sonra DLL hedef işleme yüklenen elde etmektir. Bunu yapmanın en iyi yolunun, uygulama ve DLL dosyanızın her zaman birlikte kalması gerektiğinden, uygulamanıza DLL'nize işaret eden bir içe aktarma girdisi eklemek olduğuna inanıyorum. Bir ithalat eklemek için CFF Explorer kullanın!

Bazı bilgiler eksik olabileceğinden eminim daha fazla sorunuz olacak. Yazımdan kaynaklanan başka soruları yanıtlamaya çalışacağım, ancak hemen yanıt vermezsem, yukarıdaki MSDN bağlantısını okuyun: D. Umarım bu size :) için büyük bir öğrenme deneyimi olduğu ortaya dönecek

0

Kontrol diz: http://www.autohotkey.com/

Bu pencere başlıkları vs., vs. (MS-Windows kullanılarak zaman, ben okuyabilir, script var ve bir ebay web sayfasının seçiminden ayrıştırılan kalem fiyatı ve p + p bedeli toplamı olan bir pencere açan küçük bir betik yazdım. Ayrıca, paramı değiştirdim. ve sadece öğenin fiyatını ve p + p işaretliydi, bir tuşa bastı ve voila.)

İlgili konular