keybd_event API si hakkında
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
keybd_event API si hakkında
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.
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
www.polisoft.com.tr
Re: keybd_event API si hakkında
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);
Re: keybd_event API si hakkında
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,
ş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.
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);
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Re: keybd_event API si hakkında
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

Bu arada; Microsoft artık keybd_event yerine SendInput kullanmamızı istiyor

There's no place like 127.0.0.1
Re: keybd_event API si hakkında
Merhaba @SimaWB ,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
ben uygulamanın aktif ekran olması için
Kod: Tümünü seç
wnd := self.Handle ;
ShowWindow(wnd,SW_SHOW);
SetForegroundWindow(wnd);
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Re: keybd_event API si hakkında
Şuanda deneme şansım yok ama şöyle birşeyler görmüştüm sabah araştırma yaparken:
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.
Kod: Tümünü seç
SendMessage(wnd, WM_SYSCOMMAND, SC_HOTKEY, wnd);
SendMessage(wnd, WM_SYSCOMMAND, SC_RESTORE, wnd);
SetForegroundWindow(wnd);
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
Re: keybd_event API si hakkında
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.
şö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
www.polisoft.com.tr
Re: keybd_event API si hakkında
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:
(Aklımdan yazdım, hata varsa affola )
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
There's no place like 127.0.0.1
Re: keybd_event API si hakkında
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.
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
www.polisoft.com.tr