başka bir programın menüsü nasıl çalıştırılır

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mucon
Üye
Mesajlar: 17
Kayıt: 05 Oca 2004 06:52
Konum: Ankara

başka bir programın menüsü nasıl çalıştırılır

Mesaj gönderen mucon »

Merhaba

Herhangi bir programın menüsüne kendi programım içinden nasıl ulaşabilir ve ilgili menünün tıklanmasını sağlayabilirim.
Unutma Bilgi Güçtür
Öğrendiğin Kadar Bilirsin
İşte Bu Yüzden Paylaşmayı da Öğren!!!!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.

- Delphi ile gelen WinSight programını incelemeni önericem. Bu program Windows Mesaj ağını senin ayaklarının altına seriyor. :)

- Bunları neden mi yazdım. Yaptığın her işlem, buna mouse hareketleri, bastığın tuşlar dahil; windows tarafından mesaj oluşturulur ve yine Windows tarafından daha create edilirken birer sıra numarası verdiği ilgili forma ulaştırılır.

- Araya bazı programlar girebilir. Buna müsade var. Yani bu durum basit tabirle kulaktan kulağa oyunu gibi bir hal de alabilir.

- Message Post denen bir teknikle Windows yerine bu mesajları siz oluşturup, araya girme olayını yapabilir, ilgili menünün ilgili itemine mesaj yollayıp, kullanıcı basmış da Windows bunun için mesaj oluşturmuş gibi davranmasını sağlayabilirsiniz.

- Ama önce Windows'un verdiği bu numarayı bilmek gerekiyor. Handle adı verilen Windows'un verdiği bu numarayı WinSight ile bulursunuz ama numaralar her windows açılışında ve/veya her form create olayında değişir.

- WinSight'i önermemin asıl nedeni bu numarayı bulmak değil, ilgili formun menusüne ulaşmak için gerekli minimum bilgi olan Form Adını ve sınıfını görüp, her zaman değişmeyen bir yapı sergilediğinden emin olduğunuz taktirde FindWindow api komutuyla bu keşfettiğiniz bilgiler yardımıyla ilgili Windows Handle numarasını dinamik olarak okuyabilirsiniz. Tabi bu okuduğunu numara ile hemen hemen herşeyi yaptırabilirsiniz. Çünkü forma ulaştıktan sonra onun Child denen çocuklarına erişmek için başlangıç noktanız var demektir.

- Hatta örnek olsun diye yazıyorum, istediğiniz formun AlwaysOnTop olan en üstte kalma özelliğini bile ortadan kaldırabilirsiniz.

- Başlangıç olarak bu kadarını anlatayım. Klavuz olsun diye altta Windows Hesap Makinesini çalıştıran kodu örnek olarak yazıyorum.

Kod: Tümünü seç

Var
 WindowsNumarasi : THandle;
 WindowsAdi      : String;
 ProgAdi         : String;
begin
    WindowsAdi := 'SciCalc';
    ProgAdi    := 'Calc.exe';
    WindowsNumarasi := FindWindow(PChar(WindowsAdi), Nil);
    If IntToStr(WindowsNumarasi) = '0' 
          then  WinExec( pChar(ProgAdi) , SW_MAXIMIZE) // Çalışmıyor yenisini çalıştır.
          else  SetForegroundWindow(WindowsNumarasi); // Arkada çalışıyor yenisini değil, mevcut olanı öne taşı.
end;
Resim
Resim ....Resim
Kullanıcı avatarı
mucon
Üye
Mesajlar: 17
Kayıt: 05 Oca 2004 06:52
Konum: Ankara

Mesaj gönderen mucon »

Merhabalar

Muharrem Bey yardımlarınız için çok teşekkür ederim. Sizin yönlendirmeniz sayesinde sorumun cevabını buldum.. :lol: :lol: :lol:

Kod:

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
 i:integer;
 whandle:hwnd;
 menucub,ustmenu:hwnd;
begin
  whandle:=FindWindow('Notepad',nil);  //Notepad programının handle'nı bulur
  SetForegroundWindow(whandle);  //Notepad'i öne getirir
  menucub:=getmenu(whandle);  //menü çubuğunun handle'nı alır
  ustmenu:=getsubmenu(menucub,1);  //ikinci menü (Düzen) nün handle'nı alır
  i:=GetMenuItemID(ustmenu,13);  //Düzen menüsünün Saat/Tarih alt menüsünün identifier'ini döndürür
  SendMessage(whandle,WM_COMMAND,i,0);  //ilgili menu item'ına click mesajı gönderir
  //ShowMessage(IntToStr(i));
end;
Unutma Bilgi Güçtür
Öğrendiğin Kadar Bilirsin
İşte Bu Yüzden Paylaşmayı da Öğren!!!!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selamlar ve de Tebrikler. :lol:

- Beni şaşırttınız :?, çözüm üreteceğinizi biliyordum ama şaşkınlığım sizin NotePad'de "düzen" altında 13'den fazla MenuItem olduğunu görüyorum, bahsettiğiniz "tarih/saat" item aslında 8 numaralı index'te de :o :o :o

- Başarılarınızın devamını dilerim. 8)
Resim
Resim ....Resim
Kullanıcı avatarı
mucon
Üye
Mesajlar: 17
Kayıt: 05 Oca 2004 06:52
Konum: Ankara

Mesaj gönderen mucon »

Merhaba Muharrem Bey

Ben Windows XP kullanıyorum ve NotePad'in Düzen Menüsünde 13 tane menu item var bunlardan 3 tanesi separator görevi görüyor bunları dahil edince sonuç 13 çıkıyor.. Merak ettim doğrusu siz hangi işletim sistemini kullanıyorsunuz?
ve o işletim sisteminin notepad'in Düzen menüsünde tarih/saat item'i söylediğiniz gibi 8'inci sırada?

Ayrı Bir nokta: Bunu slogan haline getireceğim ----> Ne Kadar Windows Api O Kadar Köfte.... :o :o :o

Kolay Gelsin
Unutma Bilgi Güçtür
Öğrendiğin Kadar Bilirsin
İşte Bu Yüzden Paylaşmayı da Öğren!!!!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

  • // off topic //

Selam.

- Bende naçizane 192 mb Ram ve 6 GB hdd bir dizüstü olunca lisenslı bir WinME'den öte gidemedim. :oops:

- Çalışmalarınızda başarılar...
  • // off topic //
Resim
Resim ....Resim
Cevapla