Merhabalar, custom bir mesasgebox için ihityaç duyan bir arkadaşın sorusu üzerine inceledim, opak bir layer üzerine messagebox göstermek istemiş, controllerin ekleniş sırası ve draw sırasında bir arkaplanının oluşması bunu zorlaştırmış gibi ama kullnmak isteidimiz panelden bir panel türetip onpaint metodunu ve ve defaultparams propertysini override ederek halledebiliyoruz,

Transparent Panel üretelim birtane;

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }
 
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        SolidBrush brush = new SolidBrush(Color.FromArgb(100, 0, 0, 0));
        e.Graphics.FillRectangle(brush,0,0,this.Width,this.Height);
    }
 
}

ve bunu form yüklendikten sonra create edip istdiğimiz gibi göstertebiliyoruz.!

0
1
2
3
4
5
6
7
8
9
10
11
void Form1_Load(object sender, EventArgs e)
        {
            TransparentPanel overlay = new TransparentPanel();
            overlay.BackColor = Color.FromArgb(50, Color.Black);
            overlay.Width = this.Width;
            overlay.Height = this.Height;
 
            this.Controls.Add(overlay);
            overlay.BringToFront();
 
        }

MultiThread birden fazla işlemi beraber yürütme işlemine denebilir. Multithreadin önemi şurda doğar, işlemlerimiz yürürken programımız bize o işlemi hisettirmesin (programızı işleten ana iş parcacığından farklı bir iş parcacığı bu işlemi yürütsün) istiyorsak multithread işlemlere ihtiyacımız olacaktır.

WPF elemanları bir thread tarafından oluşturulur (ana threadimzi olur bu ) ve bu thread tarafından sahiplenilir. Diğer threadler bu elemanlara ulaşamaz.(Ekranda gördüğümüz elemanlar ). wpf elemanlarının “Dispatcher” propertysi ile sahibi olan Thread’e ulaşıp ona Invoke metodunu kullanarak iş yaptırabiliyoruz. ilk önce Dispatcherin kök sınıftan geldiğini söylemeliyim ki her elemanda Disparchera ulaşabileceğimizi bilelim. Hiyerarşide  bunu göreibliyoruz.

Not : Abstract Classların köşeleri oval olarak eklenmiştir.

Dispatcherobjelerin Dispatcher propertsi bizi threade ulaştırabiliyor. threadler için aracı fonksiyonlar oluşturmak da gayet basit oldğuna göre. bir threade ulaşıp ona yaptırmak istediğimiz işlemi delegate ile verebilirz.

Örnek bir Thread yazıp bu Threadin bir listboxa eleman eklemesini sağlamaya çalışalım

0
1
2
3
4
5
6
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Items.Add(String.Format("{0} Nolu Elaman", i));
                    Thread.Sleep(100);
                }
}

bu metodu çağırırsak işlem bitene kadar programımız bize yanıt vermeyecektir. şimdi bu metodu yeni bir thread ile çağıralım.

0
   new Thread(ListBoxDoldur).Start();

bu işlem eleman eklerken bize şoyle bir hata verdirecektir.
“Başka bir iş parçacığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.”

Eleman eklemeye çalışan iş parcacığı ListBox’un sahini olmadığından bu işlemi gerçekleştiremeyecektir.

delegate Orneği ;

0
1
2
3
4
5
6
7
8
9
10
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                    (ThreadStart)delegate()
                {
                    listBox1.Items.Add(currentUser.Name);
                });
                    Thread.Sleep(100);
                }
}

listBox1 elemanının threadini alıp ona isimsiz bir fonksiyon gonderdik ve o işi yapmasını soyledik. şimdi hatasız bir şeilde 500 elemanı programımızı dondurmadan ekleyebildik.

bir sonraki örneğimiz multithread bir chat server olacaktır. iyi çalışmalar.

user32.dll hakkında ilk yazmaya karar verdiğimde bu konuların sonunun gelmeyeceğini tahmin edebildiğim için kategori açmıştım . şimdi o kategorideki ikinci yazımı yazmak istiyorum. ufak bir projede remote control olayını yapmak istediğm (sakın kendi pcnizi yonetmeyi denemeyin mutlaka bir server-client olsun )  bu olayda işimize yaricak tek EntryPoint mouse_event olacak. bu fonksiyon  windowsa mouse Down ve Mouse Up  mesajları gondermemize yarıyor. Down+Up=Click olacağından bize clik , double click , right click kapılarını da açmış oluyor.  bunu ilk once kendi pcmde denemeye kalktım ama mantıksızlık olduğunu anca pc donunca anladım (: ilk ekran goruntusu alma konumuzdaki fonksiyonu kullanarak ikinci monitorumden goruntu aldım oncelikle.  biraz eğlence oldu tabi monitor değişinceye kadar ana monitorden goruntu alıp yine ana monitordeki programcığımda bunu göstermeye çalıştım işte görüntü aşağıda (:

biraz bu görüntü ile eğlendikten sonra bir de bunlara click gondermeyi denedim  ve sonuç BUM :D click olayı ekranın aynı yerine click ettiği için bu benim programdaki clik olayıma geliyor ve click bir daha calışıyor bu da pcmin donmasına sebep oldu.

işte win apinin mouse eventlarıyla geliştirebileceğiniz sınıfım.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
a
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace WinApi
 
{
public class Mouse {
 
// user32.dll apisinin mouse_event EntriPointinden Yararlancaz.
 
[DllImport("user32.dll")]
 
private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);
 
// Onay Tanmlarmz
 
// -------------------
 
// Sol Down
 
public const UInt32 MouseEventLeftDown = 0x0002;
 
// Sol Up
public const UInt32 MouseEventLeftUp = 0x0004;
 
// Sa Down
public const UInt32 MouseEventRightDown = 0x0008;
 
// Sa Up
public const UInt32 MouseEventRightUp = 0x00016;
 
// Kk FOnksiyonumuzu yazalm tm mouse eventlar burdan geecek yani mouse_event'tan
private static void SendMouseEvent(UInt32 Button, uint x, uint y, System.IntPtr intptr)
 
{
 
mouse_event(Button, x, y, 0, new System.IntPtr());
 
}
 
// Down eventi gonderen fonksiyon. (Mouse Butonuna Basma. )
 
public static void SendDown(UInt32 Button, uint x, uint y)
 
{
 
// Cursoru tklamak istediimiz koordinatlara Konumlandryoruz.
Cursor.Position = new Point((int)x, (int)y);
 
// Olaymz Gonderiyoruz.
SendMouseEvent(Button, x, y, new System.IntPtr());
 
}
 
// Left Down Fonksiyonumuz.
public static void SendLeftDown(uint x, uint y)
 
{
 
SendDown(MouseEventLeftDown, x, y);
 
}
 
// Up Fonksiyonumuz.(Buton Brakma lemi)
public static void SendUp(UInt32 Button, uint x, uint y)
 
{
 
// Cursoru tklamak istediimiz koordinatlara Konumlandryoruz.
Cursor.Position = new Point((int)x, (int)y);
 
// Olaymz Gonderiyoryuz.
SendMouseEvent(Button, x, y, new System.IntPtr());
 
}
 
// Left Button Up Fonksiyonu (Sol Butonu Brakma ilemi)
public static void SendLeftUp(uint x, uint y)
 
{
 
SendMouseEvent(MouseEventLeftUp, x, y, new System.IntPtr());
 
}
 
// 1 basma + 1 brakma = 1 click olacandan click olaymz da bu ekilde gnderiyoruz.
 
public static void sendLeftClik(uint x, uint y)
 
{
 
SendLeftDown(x, y);
 
SendLeftUp(x, y);
 
}
 
// DoubleClick=2xClick (:
public static void SendDoubleClick(uint x, uint y)
 
{
 
sendLeftClik(x, y);
 
sendLeftClik(x, y);
 
}
 
}
 
}

yeni başladığım bir projede düşündüğüm bi kaç yönetim metodu için ihtiyacım olan ekran goruntusu almayı Grapich sınıfı ile çözebildim. ekran görüntüsünü bitmap formatında veren fonksiyonu vermek istiyorum

0
1
2
3
4
5
6
7
        private Bitmap goruntuAl(int X, int Y, int Width, int Height)
        {
            Bitmap bmp = new Bitmap(Width, Height);
            Graphics grafik;
            grafik = Graphics.FromImage(bmp);
            grafik.CopyFromScreen(X, Y, 0, 0, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            return bmp;
        }
© 2012 Tufan Suffusion theme by Sayontan Sinha