findwindow ekran karışmasını nasıl çözebilirim.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Shou »

merhaba arkadaşlar,

ben projem'de findwindow kullanıyorum ama aynı program dan 2 3 defa açarsam hepsi bir birine karışıyor bunu nasıl düzeltebilirim?

Kod: Tümünü seç

findwindow('benim programım',nil);
Burayı,

Kod: Tümünü seç

GetForegroundWindow();
Yapıyorum ama gene 1'den fazla olursa bir birine karışıyor ben sadece kendisinden bilgi çeksin istiyorum?

Yardımcı olursanız sevinirim.

Teşekkürler.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Lord_Ares »

Findwindow ile programını bulduğunda, sana programın bir handle numarası döner bu numara, program aynı bile olsa her biri için farklıdır. Dolayısı ile handle nosu bu olana şunu yaz diyerek yapabilirsin.
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Shou »

Lord_Ares yazdı:Findwindow ile programını bulduğunda, sana programın bir handle numarası döner bu numara, program aynı bile olsa her biri için farklıdır. Dolayısı ile handle nosu bu olana şunu yaz diyerek yapabilirsin.
Denedim ama program .exe ise hepsi farklı farklı yazıyor ama .dll'de 3'üne birden yazıyor handle numaralarıda farklı bir türlü çözemedim bir örnek paylaşırsanız sevinirim.
erolturk
Üye
Mesajlar: 14
Kayıt: 13 May 2016 04:49

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen erolturk »

Merhaba !

Kod: Tümünü seç

    for I := 0 to Screen.FormCount - 1 do
      if FHandle = Screen.Forms[I].Handle then // FHandle => işlem yapmak istediğiniz formun Handle si
      begin
      .
      .
      end;
Bu yöntemle istediğin forma ulaşabilirsin. Kolay gelsin...
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Shou »

Merhaba arkadaşlar bunu bir türlü başaramadım şöyle yapıyorum hangi ekran ön plandaysa ona yazıyor ben tek kendisine yazsın istiyorum.

Kod: Tümünü seç

setwindowtext(GetForegroundWindow,pchar('Ben'));
Handle numarasından nasıl oluyor onu bir türlü çözemedim yardımcı olursanız sevinirim.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Lord_Ares »

Merhaba sana şöyle bir örnek sunayım, eğer bunla yapamazsan örneğini buradan paylaşki senin istediğini yanlış anlamayıp elimizden geldiğince sana yardımcı olup gösterelim. Aşağıdaki örneği şuan deneme şansım olmadığı için direk yazdım. Ufak tefek hatalar olabilir. Sen dene, bende yarın deneyeceğim. kolay gelsin
NoT: senin kod parçanda bahsettiğin sorunun sebebi şu
setwindowtext(GetForegroundWindow,pchar('Ben'));
burada GetForegroundWindow dersen en üstteki aktif pencereye yaz demiş oluyorsun. Onun yerine senin pencere handle numarasını yazarsan olur.
aşağıdaki fonksiyon ile örneğin şöyle olmalı setwindowtext(Pencere_handle_bul ,pchar('Ben'));

Kod: Tümünü seç

function Pencere_handle_bul(aranan_pencere_basligi: string): Hwnd;
var
  Handle_No: Hwnd;
  okunan_baslik: array[0..260] of char;
begin
 
  Handle_No := GetWindow(Application.Handle, GW_HWNDFIRST);
  while Handle_No > 0 do
  begin
    
    GetWindowText(Handle_No, okunan_baslik, 255);
    if Pos(aranan_pencere_basligi, StrPas(okunan_baslik)) <> 0 then
    begin
      Result := Handle_No;
      Exit;
    end
    else
            Handle_No := GetWindow(Handle_No, GW_HWNDNEXT);
  end;
  Result := 0;
end;

/// kullanımı

Kod: Tümünü seç

var
pencerenin_handlesi: Hwnd;

begin
pencerenin_handlesi:=Pencere_handle_bul('benim projem') ;
  if pencerenin_handlesi <> 0 then
  begin
   ShowWindow(pencerenin_handlesi,SW_SHOW); /// minimize ise göster    
   SetForegroundWindow(pencerenin_handlesi);// öne plana getir;  
   setwindowtext(pencerenin_handlesi,pchar('Ben'));
   
  end ;
end;
Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Shou »

Lord_Ares yazdı:Merhaba sana şöyle bir örnek sunayım, eğer bunla yapamazsan örneğini buradan paylaşki senin istediğini yanlış anlamayıp elimizden geldiğince sana yardımcı olup gösterelim. Aşağıdaki örneği şuan deneme şansım olmadığı için direk yazdım. Ufak tefek hatalar olabilir. Sen dene, bende yarın deneyeceğim. kolay gelsin
NoT: senin kod parçanda bahsettiğin sorunun sebebi şu
setwindowtext(GetForegroundWindow,pchar('Ben'));
burada GetForegroundWindow dersen en üstteki aktif pencereye yaz demiş oluyorsun. Onun yerine senin pencere handle numarasını yazarsan olur.
aşağıdaki fonksiyon ile örneğin şöyle olmalı setwindowtext(Pencere_handle_bul ,pchar('Ben'));

Kod: Tümünü seç

function Pencere_handle_bul(aranan_pencere_basligi: string): Hwnd;
var
  Handle_No: Hwnd;
  okunan_baslik: array[0..260] of char;
begin
 
  Handle_No := GetWindow(Application.Handle, GW_HWNDFIRST);
  while Handle_No > 0 do
  begin
    
    GetWindowText(Handle_No, okunan_baslik, 255);
    if Pos(aranan_pencere_basligi, StrPas(okunan_baslik)) <> 0 then
    begin
      Result := Handle_No;
      Exit;
    end
    else
            Handle_No := GetWindow(Handle_No, GW_HWNDNEXT);
  end;
  Result := 0;
end;

/// kullanımı

Kod: Tümünü seç

var
pencerenin_handlesi: Hwnd;

begin
pencerenin_handlesi:=Pencere_handle_bul('benim projem') ;
  if pencerenin_handlesi <> 0 then
  begin
   ShowWindow(pencerenin_handlesi,SW_SHOW); /// minimize ise göster    
   SetForegroundWindow(pencerenin_handlesi);// öne plana getir;  
   setwindowtext(pencerenin_handlesi,pchar('Ben'));
   
  end ;
end;
Abi çok teşekkür ederim yorumun için ben bunu çalıştırdım ama şöyle sorun var bu caption okuyup buluyor buraya kadar sorun yok ama setwindowtext ile yazdıktan sonra birdaha yazmıyor çünkü caption değişiyor benim yapmak istediğim 5 sn de bir caption değiştirmek ve program bilgileri yazdırmak. Bu arada şöyle bir sorun var benim denediğimde setwindowtext ile yazdırınca caption'a tıklayınca değişiyor yoksa normal gözüküyor fare ile sol tık yapınca değişiyor güncelleme olmuyor nedense bir türlü başaramadım. Benim denediğim kodlar şunlar,

Kod: Tümünü seç

Function EnumWindowsProc(AHandle:HWND;LParam:LPARAM):BOOL; stdcall;
var
Pid:Cardinal; // Window Process ID
CPid:Cardinal; // Current Process ID
PWChar:PWideChar;
Begin

GetWindowThreadProcessId(AHandle,Pid);
CPid := GetCurrentProcessId;

if Pid = CPid then begin

Result := False; 
if LParam <> 0 then
PWChar := PWideChar(LParam);
ShowMessage('işte Bu benim Process''im');
setwindowtext(AHandle,pchar('Hangisi: '+PWChar+''));
end else
Result := True;
end;

Kod: Tümünü seç

procedure TUlt.Button1Click(Sender: TObject);
var
PWchar:PWideChar;
begin
PWchar := 'Yeni Caption';
EnumWindows(@EnumWindowsProc,Integer(PWChar));
end;
Benim yapmak istediğim olay 5sn de bir program bilgileri yazdığı için programı kasar mı ben bir çok program'da gördüm bunu herhangi bir sorun olmuyor ve handle 1 defa bulsa program başlayınca birdaha hep o handleye setwindowtext ile yazsa olur mu her defasında bulmak sorun yaratmaz mı?

Örnek kodlar Ahmet Yeşilçimen tarafından yazıldı.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Lord_Ares »

Pencerenin_handlesi adında bir değişken tanımla tipide Hwnd olsun. Sonra pencerenin_handlesi:= Pencere_handle_bul('pencere başlığı'); diyerek aradığın pencereyi bul. Bulduğun bu pencerenin numarası artık pencerenin_handlesi değişkeninde. Tek yapman gereken 5 saniyede bir aşağıdaki gibi göndermek.

Kod: Tümünü seç


  if pencerenin_handlesi <> 0 then
  begin
   ShowWindow(pencerenin_handlesi,SW_SHOW); /// minimize ise göster    
   SetForegroundWindow(pencerenin_handlesi);// öne plana getir;  
   setwindowtext(pencerenin_handlesi,pchar('Ben'));
   
  end ;

Kullanıcı avatarı
Shou
Üye
Mesajlar: 260
Kayıt: 26 Ağu 2011 02:00

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Shou »

@Lord_Ares

Abi dediğin gibi yaptım evet çalışıyor teşekkür ederim bir sorun olursa yazarım buraya teşekkürler.

+

Abi normal delphi projede denediğimde sorunsuz çalışıyor ama benim projem dll olduğu için dll'yi exe'ye inject ediyorum o zaman çalışmıyor.

Kod: Tümünü seç

function Pencere_handle_bul(aranan_pencere_basligi: string): Hwnd;
var
  Handle_No: Hwnd;
  okunan_baslik: array[0..260] of char;
begin

  Handle_No := GetWindow(Application.Handle, GW_HWNDFIRST);
  while Handle_No > 0 do
  begin

    GetWindowText(Handle_No, okunan_baslik, 255);
    if Pos(aranan_pencere_basligi, StrPas(okunan_baslik)) <> 0 then
    begin
      Result := Handle_No;
      Exit;
    end
    else
      Handle_No := GetWindow(Handle_No, GW_HWNDNEXT);
  end;
  Result := 0;
end;
Dll'de pencere handlesi bulamıyor bunu nasıl düzeltebiliriz?

Örnek Project1.exe - Proje.dll inject ediyorum ve benim kodlar Proje.dll içinde.


+

Abi şöyle bir sorun var diyelim Program.exe adlı programı 3 defa açtık hangisi ön plandaysa readprocessmemory prochandle hangisi ön plandaysa diğer 2'die onu okuyor bunu nasıl düzeltebilirim?

Kod: Tümünü seç

WndHandle := FindWindow('Project1',nil);
GetWindowThreadProcessID(WndHandle,@ProcID);
prochandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcId);

Kod: Tümünü seç

function deger:string;
var
str,statusbar,getstatusbar:dword;
prochandle:thandle;
  WndHandle:HWND;
  ProcID:DWord;
  reads:cardinal;
begin
statusbar := $00CC535C;

WndHandle := FindWindow('Project1',nil);
GetWindowThreadProcessID(WndHandle,@ProcID);
prochandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcId);

readprocessmemory(ProcHandle, Ptr(statusbar), @getstatusbar, 4, reads);

readprocessmemory(ProcHandle, Ptr(getstatusbar + $3C), @str, 2, reads);
result:=('deger: '+inttostr(str)+'');
end;

Kod: Tümünü seç

prochandle := pencerenin_handlesi;
Yapıyorum ama okumuyor bunu nasıl çözebilirim?

Yardımcı olursan sevinirim.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: findwindow ekran karışmasını nasıl çözebilirim.

Mesaj gönderen Lord_Ares »

İşler şimdi biraz değişti , Exe içine gömüp kullanıcam dersen projenin niyetinden şüpheleniriz :D Bütün pencerelerin isimlerini değiştirmesinin nedenini sanırım Function EnumWindowsProc kullanmandan kaynaklı. Bu fonksiyon ana pencerenin altındaki tüm pencereleri gezerek işlemi gerçekleştirdiği için bulduğu tüm pencerelerin isimlerine aynı ismi atar. Onun yerine findwindow ile ilk pencereyi bul handle numarasını al ve GetnextWindow(Hand,GW_HWNDNEXT) şeklinde bir sonraki pencereleride gezerek aradığın özelliklere sahip tüm pencerelerin handle numaralarını topla.
Ardından hangi pencereye ne isim yazmak istiyorsan onun handle vererek baştan aktif et sonra başlığını değiştir.
kullandığın bu fonksiyonları daha iyi anlamayabilmen için istersen şuraya bir bak açıklamaları ve nasıl kullanıldığı var belki işine yarayabilir.

http://www.csharpnedir.com/articles/read/?id=565

Kodlarını Dll de yazıp Exe içine gömerek nasıl çağırırsın bilemiyorum. :))
Cevapla