PostMessage, SendMessage

PostMessage, SendMessage kullanarak programlara bilgi göndermeye çalışıyorum. a,b,2,3 gibi tuşları sorunsuz gönderiyor ama yön tuşlarını(yukarı, aşağı, sağa, sola) gönderirken sorun yaşıyorum. Bu dört tuşun bilgisini gönderince sürekliliği oluyor. Örneğin yukarı bilgisini gönderince sürekli yukarı işliyor 1 defa ilerleyip bırakmıyor. Bu konu hakkında bilgisi olanlar yardımcı olabilir mi? Bu iki yöntemi kullanma sebebim gönderdiğim program en üstte olması gerekmiyor. Farklı modüller hep üstte olmasını istiyor.

Örnek kod:

import win32gui
import win32con
import win32api


hwndMain = win32gui.FindWindow(None, "Program Pencere İsmi")

win32api.PostMessage(hwndMain, win32con.WM_KEYDOWN,win32con.VK_LEFT, 0)
2 Beğeni

Bir de WM_KEYUP mesaji gönderin.

Ayrıca winapi yi böyle işlemler için kullanmak hiç aklıma gelmemişti. Güzel bir soru :slight_smile:

1 Beğeni

WM_KEYUP denemiştim onda hiç tepki vermiyor program. Hatta win32con içerigini sıralttım onlardan denedim ama istediğimi bulamadim. Bunun dışında farkli moduller var acık ekranda tusa basmamı sağlıyor onları PostMessage içinde kullandım belki çalışır deye ama bu defa programa bilgi göndermeyip konsolda tuşa bastı.

win32api.PostMessage(hwndMain, win32con.WM_KEYDOWN,win32con.VK_LEFT, 0)

Aslında burda sondaki 0 galiba bilginin kaç defa gönderileceğini gösteriyor ama surekliliğine anlam veremedim. Diğer tuşlar düzgün çalışırken sadece yön tuşlarında oluyor. İki farklı yerde denedim aynı oldu ikisinde de.

Öncelikle PostMessage ve SendMessage arasında fark olduğunu bilmek lazım. PostMessage ile gönderdiğiniz mesajlar hemen işlenmez, program onu kuyruktan alana kadar bekler. Ancak SendMessage ile gönderdiğiniz mesajlar hemen işlenir.

Diğer kısım, PostMessage fonksiyonuna verdiğiniz parametreler. Şu sayfadan, hangi parametreleri aldığını ve ne işe yaradığını görebilirsiniz. Buna göre, son parametre mesajın kaç kere gönderileceğiyle ilgili değildir.

Nasıl bir programa mesaj gönderdiğinizi bilmiyorum, ama bir de SendInput fonksiyonuna bakın isterseniz

Öncelikle bilgiler için teşekkür ederim. PostMessage ve SendMessage arasındaki farkı gerçekten bilmiyordum. PostMessage kullanıyordum şuan SendMessage kullanmaya başladım. Bide bu fonksiyonlar parametrelerine öncede bakmıştım ama tam ne işe yaradını anlamamıştım WPARAM, LPARAM kımını. Şuan daha da bilmiyorum. Bu konuda bilgi verebilir misiniz? SendInput fonksiyonuna baktım denemedim oda konsolda çalıştı bilgiyi programa gönderemedi. Son olarak win32con.WM_KEYDOWN ve win32con.WM_KEYUP bu ikisi tam olarak ne işe ve ne gibi durumlarda kullanıyor? Bu konuda da bilgi verebilir misiniz? İlk sorduğum soruyu çözdüm ama deneme yanılma yoluyla yaptım. Bunları sorma nedenim de ne yaptığımı bilerek yapmak isteğim için.

win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, 0x28, 0)
win32api.SendMessage(hwnd, win32con.WM_KEYUP, 0x28, 0)

Kodu bu şekilde yazınca yon tuşuna 1 defa basıyor. Ama neden böyle düzgün çalıştığını bilmiyorum. :slight_smile: Deneme yaparak buldum.

Yerine degil, sonrasinda.

Aslında ben de bunu kastetmiştim, eğer yerine gönderdiyse olmayacaktır tabi.

Ben sizden bu şekilde tuş göndermenizi istemiştim. Yani WM_KEYDOWN ile tuşun basıldığı mesajını, WM_KEYUP ile tuşun serbest bırakıldığı mesajını gönderdiğiniz için çalışıyor.

Ve 0x28 kodu da VK_DOWN tuşunun kodudur.

edit: Kusura bakmayın, WPARAM LPARAM hakkında bilgi vermeyi unuttum. Bu iki parametre, mesajlar hakkında ek bilgiler göndermek için kullanılır. Mesela hangi tuşun basıldığı, hangi tuşlarla birlikte basıldığı(CTRL,ALT vs) bu iki parametre ile birlikte gönderilir.

1 Beğeni

Bilgiler için teşekkürler. VK_DOWN, WM_KEYUP ifadelerini klavyedeki tuşların yerini ifade ediyor sanmıştım ondan iş uzadı. :slight_smile:

1 Beğeni

Bu konuyla ilgili çözemediğim bir durum daha oldu. Ctrl + Alt + Delete gibi bilgi göndermesini bir türlü yapamadım. Çok fazla konuya da baktım ama çalışan bir şey bulamadım yada ben anlayamadım. Bu konuda bilgisi olanlar yardımcı olabilir mi?

Bu kombinasyon biraz ayrıcalıklı bir kombinasyon, çünkü seni logout edebilecek bir kombinasyon. Doğal olarak windows bir yetki kontrolü yapmadan doğrudan bu kombinasyonu simüle etmene izinvermeyecektir.

Aslında bu konuda çok sayıda açıklama sayfasına ulaştım. Soru güzel sonuçta.

Lock Windows Desktop - CodeProject

Ama bana en düzgün örnek burada gibi geldi. Kodlar C üzerinden ama python a çevirmek çok zor görünmedi.

After injecting the code into Winlogon's subclassing, the SAS window reduces too:

Kısmı zaten kendini anlatıyor gibi.

hSASWnd = FindWindow("SAS Window class", "SAS window");
SetWindowLong(hSASWnd, GWL_WNDPROC, NewSASWindowProc);
LRESULT CALLBACK NewSASWindowProc(HWND hWnd, UINT uMsg,
  WPARAM wParam, LPARAM lParam)
{
  if (uMsg == WM_HOTKEY)
  {
     // Ctrl+Alt+Del
     if (lparam == MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE))
  return 1;
  }
  return CallWindowProc(OldSASWindowProc, hWnd, wParam, lParam);
}

Bu C kodu parçaları python kodu için ipucu olacaktır sanırım.

Python’a uyarlamayı deneyebiliriz.

Biraz deneyeyim. Benim asıl amacım 3 sayısındaki üçüncü karaktere yani # (hash) ulaşmaya çalışıyorum. “keybd_event” kullandığımda normalde o tuşa basıyor ama o anki aktif pencerede tuşa basıyor. Bu arada bilgiler için sağol.

Burada yazanları biraz uyarlamaya çalıştım ama bir türlü çalışmıyor. Amacım ctrl + alt + 3 (# hash ) tuşuna ulaşmak. Bu konuda biraz daha bilgi verebilir misiniz? Hash nasıl ulaşabilirim?