VB.NET'te ekran görüntüsü alma ama nasıl

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Arkadaşlar VB.NET'te basit bir ekran görüntüsü alma programı yapıyorum ama biraz farklı olacak. bir Form oluşturuyorun bu Formun içine bir PictureBox1 koyuyorum bunuda Dock özelliğini Fill yapıyorum sonra bu PictureBox1'i şeffaf yapıyorum işte bu programı çalıştırdığımda açılan formun içi tamamen şeffaf oluyor arkaplanda ne varsa görülüyor formu kenarlardan çekip istediğim gibi boyutlandırabiliyorum istediğim formun içinde görünen bu arkaplanın (sadece içerde kalanın) resmini çekmek benim elimdeki kod komple ekran görüntüsünü alıyor bu kodu nasıl düzeltmem gerek benim kod aşağıda



Kod:
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim bounds As Rectangle
        Dim screenshot As System.Drawing.Bitmap
        Dim graph As Graphics
        bounds = Screen.PrimaryScreen.Bounds
        screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        graph = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
        PictureBox1.Image = screenshot
        Timer1.Enabled = False
        Me.Opacity = 100
    End Sub
:hammer:
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
Kod:
bounds = Screen.PrimaryScreen.Bounds
burada bounds ekranın tamamını alıyor. senin bounds'u set'lemen gereken değer kendi window'unun pozisyonu olmalı. aktif window pozisyonunu almak için de
API fonksiyonu : getWindowRect tanımlaman lazım. bunu biraz araştır, ya daha kolay bir yol biliyorsan onunla yap. ama bounds'u doğru setlemelisin.

şuradan bunu nasıl yapabileceğini bulursun.

BURADAN DEVAM ET
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Kod:
bounds = Screen.PrimaryScreen.Bounds
burada bounds ekranın tamamını alıyor. senin bounds'u set'lemen gereken değer kendi window'unun pozisyonu olmalı. aktif window pozisyonunu almak için de
API fonksiyonu : getWindowRect tanımlaman lazım. bunu biraz araştır, ya daha kolay bir yol biliyorsan onunla yap. ama bounds'u doğru setlemelisin.

şuradan bunu nasıl yapabileceğini bulursun.

BURADAN DEVAM ET


Biraz daha yardımcı olabilirmisin değişik denemeler yaptım olmadı senin belirttiğin konu hakkında bulduğum birkaç adreste aşağıda

http://www.experts-exchange.com/Programming/Languages/.NET/.NET_Framework_2.0/Q_24004968.html
http://vbcity.com/forums/t/22876.aspx

http://binaryworld.net/Main/CodeDetail.aspx?CodeId=1548#copy

http://www.vbdotnetforums.com/vb-ne...36-getwindowrect-visual-basic-net-2005-a.html




:hammer:
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
şu saatten sonra bana VB.Net öğrettin :)

hiç vb bilmeden bu kadar yazdım :) java olsa daha kolay yazardım herhalde:P

ekli dosyayı kullanabilirsin.


_________________________________________________________________________

edit :
form üzerinde biraz oynadıktan sonra çok güzel bir hal aldı. başlığını daha sonra ayrıten açacağım.

ekli dosya yeni bir ekran görüntüsü yakalama aracı oldu. win 7 kullanmayan arkadaşlar kullanmayı denerse ( win 7 de daha güzeli default var ) hataları(illa ki çıkar ) vs gidermeye çalışırız.

..exe.zip olan sadece son halini içermektedir.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Teşekkür ederim son halide çok güzel olmuş son halininde kaynak kodunu versene fare ile formun her konumundan tutup sürükleme güzel olmuş henüz bu tekniği öğrenemedikte
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
araştır bakalım biraz. "takıldığında" yardımcı olurum. ben hepsini yazdıktan sonra sena bir faydası yok. kaldı ki ben bunu yapamaya başladığımda vb bilmiyordum :)
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
araştır bakalım biraz. "takıldığında" yardımcı olurum. ben hepsini yazdıktan sonra sena bir faydası yok. kaldı ki ben bunu yapamaya başladığımda vb bilmiyordum :)
Benim hazırladığım çalışmayı XP'de denedim ama şeffaf olan bölgeye tıklayamıyorum sanki ortası delikmiş gibi davranıyor Win7'de ise sanki bir cama dokunuyormuş gibi oluyor XP'de transparan alana dokunabilmek bu alanda sağ tuş çalıştırma ve buradan tutup formu taşıma nasıl olucak bende bu özellikler sadece Win7'de çalışıyor XP'de çalışmıyor
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
dokunma ve taşıma olayını yaptığın kodu koyar mısın. bir bakalım ?
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
dokunma ve taşıma olayını yaptığın kodu koyar mısın. bir bakalım ?

KOD1 (Public Class Form1'in hemen altına olduğu gibi yazman yeterli)
Kod:
#Region "API Declarations"
    Private Declare Sub ReleaseCapture Lib "user32" ()
    Private Declare Sub SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
    hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
    ByVal lParam As Integer)

    Private Const WM_NCLBUTTONDOWN As Integer = &HA1
    Private Const HTCAPTION As Integer = 2
#End Region
Yukarıdaki kodu ekledikten sonra
Fare le form üzerinde neye dokunup sürükleyeceksen o elemanın MouseDown olayına (bu projede PictureBox1 ile Form1) aşağıdaki kod yazılıyor

KOD2
Kod:
        If e.Button = MouseButtons.Left Then
            ReleaseCapture()
            SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0&)

        End If
:mrgreen:
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
api ile uğraşmak yerine
mouse down ve mouse move actionlarını kullan.
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
seni teşvik etmeye çalışıyorum ama sen araştırmak yerine sadece direk cevap istiyorsun.
mouse down edildiğinde global iki değişken setle.
mouse move edildiğinde e.button ( e burada event ) left ise ( yani sol tuşa basılarak bir drag işlemi yapılıyorsa )
formu taşı.
tabi taşırken ufak bir kaç matematiksel işlem yapman gerekecek ki onları kesinlikle söylemeyeceğim.


araştırırken arama sorgun şuna benzer bir şey olsun :

how to move form without title bar vb.net
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
seni teşvik etmeye çalışıyorum ama sen araştırmak yerine sadece direk cevap istiyorsun.
mouse down edildiğinde global iki değişken setle.
mouse move edildiğinde e.button ( e burada event ) left ise ( yani sol tuşa basılarak bir drag işlemi yapılıyorsa )
formu taşı.
tabi taşırken ufak bir kaç matematiksel işlem yapman gerekecek ki onları kesinlikle söylemeyeceğim.


araştırırken arama sorgun şuna benzer bir şey olsun :

how to move form without title bar vb.net


Sen istediğin kadar hazırcı de benim bunları nekadar araştırdığımı bilemezsin bu konuda denediğim kodlardan sadece API'li olanlar çalıştı diğerleri hep hatalı yada eksik çıkıyor olmuyor

http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/87763ab4-2dfe-47c8-9f1d-698f0777e742

http://msdn.microsoft.com/tr-tr/library/system.windows.forms.control.dodragdrop.aspx


Bunlar sadece iki örnek bu konuda okadar sayfa buldumki çalışan yok denk gelmedi hepsinde tanımlanamayan kodlar vesaireler dolu
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
daha fazla çaba daha fazla hırs :)

Kod:
	Sub PictureBox1MouseDown(sender As Object, e As MouseEventArgs)
		difX = Me.MousePosition.X - Me.Location.X
		difY = Me.MousePosition.Y - Me.Location.Y
		Me.Opacity =  0.7
	End Sub
	
	'--------------------------------------------------------------------------------------------------------------
	
	Sub PictureBox1MouseMove(sender As Object, e As MouseEventArgs)
		If e.Button = MouseButtons.Left Then
 			newPoint = Me.MousePosition
			newPoint.X = newPoint.X - (difX)
 			newPoint.Y = newPoint.Y - (difY)
 			Me.Location = newPoint
		End If
	End Sub

şurası benim formu taşımak için kullandığım sub'lar.

difX ve difY class variable.
newpoint de yine aşağıdaki gibi tanımlı bir class variable.
Dim newPoint As New System.Drawing.Point()
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
difX ve difY class variable ? bunları tam olarak nasıl tanımlıyoruz bende kod hata verdi herhalde bunları doğru tanımlamadım.
Hala anlamadın herhalde ben kendi kendime vb.net' i öğreniyorum bulunduğum şehirde programcılık kursu verilmiyor Burası türkiye işte!!!!

Benim yazdığım hali aşağıda böyle kod çalışıyor ama şeffaf form ve picturebox1 yapınca şeffaf yer delik gibi oluyo fare tutamıyor hem win7'de hemde xp'de şimdi denedim


Kod:
Public Class Form1
    Dim newPoint As New System.Drawing.Point()
    Dim difX As Integer
    Dim difY As Integer

    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        difX = Control.MousePosition.X - Me.Location.X
        difY = Control.MousePosition.Y - Me.Location.Y
        Me.Opacity = 0.7
    End Sub


    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If e.Button = MouseButtons.Left Then
            newPoint = Control.MousePosition
            newPoint.X = newPoint.X - (difX)
            newPoint.Y = newPoint.Y - (difY)
            Me.Location = newPoint
        End If
    End Sub
End Class



:mrgreen:
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
zaten bu da olmazsa artık. en sevmediğim şeyi yapcam. bırak dicem sana :)
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Galiba öyle olacak senin bu konuda değil başka açtığın bir konuda verdiğin transparentWindow.exe programını xp'de deneyince çalışıyor görünmüştü bu nedenle bu konu üzerinde durdum ben çok uğraştım XP'de transparan kısmına fare ile dokunmayı beceremedim şimdi senin transparentWindow.exe çalışmayı tekrar XP'de denedim ve daha önce gözümden kaçan bişey farkettim senin form hiç şeffaf olmuyorki açılır açılmaz ekran görüntüsünü alıyor bu sayede hiç şeffaf olmadan her hareket ettirişimde resim çekiyor.


Napalım artık yardımların için sağol
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
yok her hareket ettirişinde değil.
hareket ettirirken şeffaf oluyor.
opacity = 0.7 yapıyorum move anında ;)
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
bende form load'da yaptım aynısını olmadı , sen çalışmanda form ve picturebox1 özelliklerini nasıl yapmıştın ben picturebox1 arkaplanı Transparent yaptım form1'in arkaplanını herhangibir renk yaptım sonrada Form1'in TransparencyKey kısmından bu rengin aynısını seçip onuda transparan yaptım
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
ben onlarla hıc ugrasmadan direk olarak form'un opacity ile oynuyorum action'a göre.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
Formumun üst kısmına ToolStrip1 ekledim ve XP'de çalışacak şekle getirdim bu defada kordinatlar ayarlanmıyor kodda değişiklikmi yapmak lazım acep

13709009-a3d.jpg

Koddaki kordinatları resmi tam çerçeve içini çekecek şekilde sıfıra sıfır yaptım ama çekilen resim hep pencerenin sağ altına iniyor olduğu yerde kalmıyor bu sorun nasıl çözülür? ToolStrip1 ekleyince kordinatlar hiç tutmuyor ToolStrip1 eklemeyince kordinatlar ayarlanabiliyor.

Kullandığım Kod
Kod:
    Sub GoruntuYakala()
        Dim GoruntuAL As System.Drawing.Bitmap
        Dim grafik As Graphics
        GoruntuAL = New System.Drawing.Bitmap(Me.Width, Me.Height) 'form boyutu neyse o kadarlık bitmap oluşturuyor.
        grafik = Graphics.FromImage(GoruntuAL)
        grafik.CopyFromScreen(Me.Left + 9, Me.Top + 69, 18, 76, Me.Size, CopyPixelOperation.SourceCopy)
        PictureBox1.Image = GoruntuAL
        StandartResimÇekmeSaati.Enabled = False
        Me.Opacity = 100 'görünür hale getiriyoruz.
    End Sub


:hammer:
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
baya güzel oturmuş bu şekilde :) biz beraber bunu satarız belki. öhöm neyse;
copyfromscreen alanındaki 9 ve 69 değerleri ile oynayarak doğru alanı görmen lazım. formun border çizgisi ve toolstrip kalınlığı nedeni ile.
 

Vatansever

Asistan
Katılım
23 Ağustos 2007
Mesajlar
405
Reaksiyon puanı
1
Puanları
18
baya güzel oturmuş bu şekilde :) biz beraber bunu satarız belki. öhöm neyse;
copyfromscreen alanındaki 9 ve 69 değerleri ile oynayarak doğru alanı görmen lazım. formun border çizgisi ve toolstrip kalınlığı nedeni ile.
Dediğini yaptım 1 ile 200 değerlerine kadar oynadım konumu hiç değiştirmiyor sadece resim çekme sınırlarını değiştiriyor bu değerler.
Me.Left + 9, Me.Top + 69, 18, 76 epey inceledim rakamları şöyle 1rakam soltarafın, 2rakam üsttarafın
3rakam sağtarafın, 4rakam alttarafın resim sınırlarını belirliyor Resim sınırları iyi ama pozisyon kötü
 
S

SDN Okuru

SDN Okuru
VB de yazdığım Windows App i ekranda kullanıcıya sunmam için gereken kod nedir yardım eder misniz
 
Üst