keybd_event API si hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

keybd_event API si hakkında

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,

keybd_event API si yardımıyla uygulamada TWEbBrowser içinde tuş göndererek bazı işlemler yaptırıyorum, fakat ilgili fonksiyon sadece aktif progrma tuş gönderiyor, yani ben aktif uygulamayı değiştirdiğim anda tuşlar başka programa gidiyor,
PostMessage da olduğu gibi bu API handle parametresi almıyor, keybd_event i sadece geçerli uygulamada işletmenin bir yolu var mı? PsotMessage ile aynı tuşu gönderdiğimde (TAb ve ok tuşları gönderiyorum) etkiyi yapmıyor keybd_event bu API gerçektende tuşa basıldığında ne oluyorsa oluyor..
Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
notname
Üye
Mesajlar: 149
Kayıt: 11 Şub 2005 02:15

Re: keybd_event API si hakkında

Mesaj gönderen notname »

Kod: Tümünü seç

tab için
sendmessage(handle,WM_char, vk_tab,0)

yukarı ok
sendmessage(handle,WM_keydown, vk_up,0);
sendmessage(handle,WM_keyup, vk_up,0);
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen vkamadan »

Merhaba ,
SendMessage / PostMessage ile testler yapmıştım sizin verdiğiniz örnekte olduğu gibi ;
işe yaramıyor bir web sayfasında imlecin bulunduğu INPUT içinde normal TAB a kalvyeden bastığımda bir çok olay gerçekleşiyor, SendMessage / PostMessage ile TAB gönderdiğimde imleç yerinden bile kıpırdamıyor,

Kod: Tümünü seç

keybd_event(VK_TAB, 1, 0, 0);
keybd_event(VK_TAB, 1, KEYEVENTF_KEYUP, 0);
şeklinde gerçekten TAB a basılmış gibi davranıyor fakat penceden bağımsız direk klavyeden komut gönderdiği için örn ; programıma bir Timer koyup 1000ms de bir TAB gönderecek hale getiridğimde benim programdan editler arası dolaşırken açık olan WORD penceresine tıklar tıklamaz wordde TAB a basmaya devam ediyorlar. bu konuda gerçekten tuşu simüle eden ama verdiğim handle a bu gönderimi yapacak bir API ye ihtiyacım var umarım böyle bir şey vardır.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen SimaWB »

Sanırım mesaj göndereceğin programı aktif yapmaktan başka çare yok. Şuanda aktif olan pencerenin Handle'ını sakla, mesaj göndereceğin pencereyi aktif et, sonra sakladığın Handle'ı tekrar aktif pencere yap. Çok uygun bir çözüm değil ama senin de bahsettiğin gibi diğer yöntemler sıkıntılı :(
Bu arada; Microsoft artık keybd_event yerine SendInput kullanmamızı istiyor :)
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen vkamadan »

SimaWB yazdı:Sanırım mesaj göndereceğin programı aktif yapmaktan başka çare yok. Şuanda aktif olan pencerenin Handle'ını sakla, mesaj göndereceğin pencereyi aktif et, sonra sakladığın Handle'ı tekrar aktif pencere yap. Çok uygun bir çözüm değil ama senin de bahsettiğin gibi diğer yöntemler sıkıntılı :(
Bu arada; Microsoft artık keybd_event yerine SendInput kullanmamızı istiyor :)
Merhaba @SimaWB ,

ben uygulamanın aktif ekran olması için

Kod: Tümünü seç

wnd := self.Handle ;

ShowWindow(wnd,SW_SHOW);
  SetForegroundWindow(wnd);
kodlarını kullanıyorum fakat sorun yaşıyorum, daha sağlam bir yöntem var mı ? peki aynı programdan aynı masaüstünde birden fazla asenkron bir şekilde çalışacağı durumlarda sizce bu aktif yapıp tuş gönderme sekteye uğrar mı?
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen SimaWB »

Şuanda deneme şansım yok ama şöyle birşeyler görmüştüm sabah araştırma yaparken:

Kod: Tümünü seç

SendMessage(wnd, WM_SYSCOMMAND, SC_HOTKEY, wnd);
SendMessage(wnd, WM_SYSCOMMAND, SC_RESTORE, wnd);
SetForegroundWindow(wnd);
Bir de; Application.Handle ile Self.Handle'nın farklı olması sorun olabilir mi?

Belki işine yarayabilir:
bir önceki yada bir sonraki aktif pencereyi bulmak için GetNextWindow 'u kullanabilirsin.
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen vkamadan »

Application.Handle kullandığımda işler iyice karıştı, self.handle yada WebBrowser.Handle kullandığımda sorun olmadı,
şöyle birşeyler yapacağım application lar ortak bir yerde bulunan flağı kontrol edip tuş gönderme işlemini aralarında konuşarak yapacaklar. bakalım iptidai bir çözüm gibi geliyor kulağa ama başka çare yok.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen SimaWB »

Projeyi tam olarak bilmediğim için yanlış düşünüyor olabilirim ama; kendi Windows mesajınızı tanımlayıp, PostMessage/SendMessage kullansanız. Bu mesajı yakaladığınızda WebBrowser'a tuşları gönderseniz. Böylece programınız aktif olsun olmasın mesajları sadece sizin programınız yakalar:

Kod: Tümünü seç

const
  WM_TAB_MSG = WM_USER + 100;

//formun private kısmında
  procedure OnTabMessage(var Msg: TMessage); message WM_TAB_MSG;

procedure TForm1.OnTabMessage(var Msg: TMessage);
begin
  //mesaj yakalandı. WebBrowser'a tuşları gönder
end;

//daha sonra gerekli yerde
PostMessage(Handle, WM_TAB_MSG, 0 , 0);//lParam ve wParam ile istediğiniz data'yı da gönderebilirsiniz
(Aklımdan yazdım, hata varsa affola )
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: keybd_event API si hakkında

Mesaj gönderen vkamadan »

Fakat sorun şu ,
Aynı exe den bir çok kopya çalışacağı için tam keybd_event tetiklendiğinde yinede o an aktif pencerenin olması gereken pencere olduğunu garanti edemiyoruz.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla