Handle almak ile ilgili

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Handle almak ile ilgili

Mesaj gönderen webaytek »

gerçekten özürlerimi sunarak bişey sormak istiyorum...
Handle alma konusunda yeterli doküman okumama rağmen - şu istediğim şeyi yapamadım * yardımcı olursanız sevinirim.

Handle'ı "a" olan form için mouse click gönder (mouseclick ile ilgili sorunum yok)
handle'ı "b" olan form için klavye tuşları ile harf bastır örneğin veritabanından kriptolu okunan şifre gibi... (klavyeden harf göndermekle de ilgili sorunum yok)
Sorunum tamamen
- Handle al
- a ise button1.click;
- b ise button2.click; ten ibaret. yardımcı olursanız çok sevinirim.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Re: Handle almak ile ilgili

Mesaj gönderen undefined »

webaytek yazdı: - Handle al
- a ise button1.click;
- b ise button2.click; ten ibaret. yardımcı olursanız çok sevinirim.
Handle ı nerden nasıl alıon peki? Biraz kod göstersene şu an varsa yazdığın
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Kod: Tümünü seç

 private
    { Private declarations }
    procedure ComboBoxMessage(var Msg: TMessage); message WM_USER;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EnumProc(wnd: HWND; Alabel: TLabel): BOOL; stdcall;
var
  buffer: array[0..50] of Char;
begin
  Result := True;
  if IsWindowVisible(wnd) then
  begin
    GetClassName(wnd, buffer, SizeOf(buffer));
    if StrIComp(buffer, 'ComboLBox') = 0 then
    begin
      Alabel.Caption := Format('handle found: %x', [wnd]);
      Result := False;
    end;
  end;
end;

procedure TForm1.ComboBoxMessage(var Msg: TMessage);
begin
  EnumThreadWindows(GetCurrentThreadID, @EnumProc, Integer(label1));
end;

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
  PostMessage(Handle, WM_USER, 0, 0);
end;
bu kod handle numarasın verir diye düşünüyorum..Deneme şansım olmadı hazırdan veriyorum.kolay gelsin.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Kod: Tümünü seç

procedure TForm1.blok_listesine_ekleClick(Sender: TObject);
var
  baslik : string
  HFare : HWND;
  HSonrakiWinMsg:HWND;
  isaretleyici : TPOINT;
  baslikUzunlugu : integer;
  begin
  GetCursorPos(isaretleyici);
  HFare := WindowFromPoint(isaretleyici); 
  if HFare = HSonrakiWinMsg then Exit;
  HSonrakiWinMsg := HFare; 
  baslikUzunlugu := SendMessage(HFare, WM_GETTEXTLENGTH, 0, 0) + 1; 
  SetLength(baslik, baslikUzunlugu); 
  SendMessage(HSonrakiWinMsg, WM_GETTEXT, baslikUzunlugu,LongInt(@baslik[1]));
if length(baslik) <> 1 then
        begin
        liste1.items.add(baslik);
        liste1.itemindex:=liste1.Items.Count-1
        end
else
        begin
        showmessage('Boş Başlık Ekleyemezsiniz - Fare imlecinin pencere başlığında olduğundan emin olun.');
        end
eskiden bu foruma da kodlarını yolladığım bi pop-up killer vardı. oradan copy paste ediyorum. Galiba bu kod handle almama gerek kalmadan sadece form başlığını kullanarak komut göndermeme yarayacaktır. Henüz denemedim.
Bu arada @undefined haklısın - kodu yazdım zannettim de... :oops:
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Kıymetli zamanınızı çaldığım için kusuruma bakmayın
Sorumun cevabını şuanlık çözdüm. ancak sadece günü kurtardım - aslında bu işi handle alma yolu ile yapmam gerekiyordu.

Kod: Tümünü seç

unit Unit1;

interface

uses
  clipbrd,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Edit1: TEdit;
    saat2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure saat2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  HFare : HWND;
  baslik : string;
  HSonrakiWinMsg:HWND;
  isaretleyici : TPOINT;
  baslikUzunlugu : integer;
  begin
  GetCursorPos(isaretleyici);
  HFare := WindowFromPoint(isaretleyici);
  if HFare = HSonrakiWinMsg then Exit;
  HSonrakiWinMsg := HFare;
  baslikUzunlugu := SendMessage(HFare, WM_GETTEXTLENGTH, 0, 0) + 1;
  SetLength(baslik, baslikUzunlugu);
  SendMessage(HSonrakiWinMsg, WM_GETTEXT, baslikUzunlugu,LongInt(@baslik[1]));
edit1.text:=baslik;
if edit1.text = ProgramCaption_xxx_v3.2' then
saat2.enabled:=true
else
saat2.enabled:=false

end;

procedure TForm1.saat2Timer(Sender: TObject);
begin
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;

end.
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Yaw yine ben yine aynı konu 8)
Bir projede şööle bişiy yapmam lazım. örnek olarak çalışan bir uygulamayı diyelim ki msnmsgr.exe (MSN Messenger) çalışıyor.
Programa şu kodları göndermek istiyorum...

Program ana penceresini resize edilecek (top:=0 & width:=screen - taskbarwidth) ve ekranın sağ kenarına yapıştırılacak. Form Aktif olduğu sürece görünür, deaktif olduğu anda da sağa doğru kayarak ekrandan gizlenecek. Tekrar aktive edildiği zaman sola doğru kayarak görünür olacak.

Ancak bunu nasıl yapacağımı bulamadım. Kafamın karştığı nokta ise şu : msnmsgr.exe programına ait diyelim ki 3 adet form var; bunlardan hangisi anaform bunu nasıl öğrenebilirim ve yukarıdaki komutu direkt (sadece) bu forma nasıl gönderebilirim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

Kendimden utanıyorum artık... Hep aynı konu :roll:

Şimdi de olay şu : Yazdığım bir program ile bir ticari yazılım üzerinde bir kontrol sahibi olmak istiyorum. Atladığım aşamalar şunlar :
mouse ile handle alarak programa hem mouse hem de klavye ile bazı komutlar göndermek
Formumu herzaman aktif kılmak
Timerların zaman aralıklarını RAM'e göre yoğunlaştırmak veya azaltmak gibi... Internet hızına bağlı olarak bazı işlemler yaptırmak falan dilan...
Bahsettiğim Ticari Program Aktif iken bu yazdıklarımı yapabiliyorum ancak... Program kendini taskbara attığı anda elim kolum bağlı kalıyor. çünkü handle alma işini mouse ile TITLE daha doorusu form caption'ı okutarak yapmak zorundayım... Burada takıldığım noktayı atlayabilmem için sizden şu tür bir yardım rica ediyorum. Taskbara gönderilmiş programı nasıl önce VISIBLE sonra MAXIMIZE sonra da ACTIVE hale getirebilirim... Program örneği e-mule gibi. Hatta daha yaygın olduğunu sanıyorum ki : MSN Messenger gibi. Minimize edildiğinde önce invisible oluyor sonra da taskbara icon olarak gidiyor. - KOLAY GELSİN
Cevapla