lostyazilim
tr.link

RGB renk bulucu Mouse Click Yardım

7 Mesajlar 1.505 Okunma
lstbozum
tr.link

YILDIRAN YILDIRAN WM Aracı Kullanıcı
  • Üyelik 24.04.2015
  • Yaş/Cinsiyet 35 / E
  • Meslek Turizmci
  • Konum Antalya
  • Ad Soyad E** Y**
  • Mesajlar 29
  • Beğeniler 13 / 1
  • Ticaret 1, (%100)
Merhaba,

Cursor, evet renge tıklıyor, ancak cok ust kısma tıklıyor ve bu yüzden sıkıntı yaşıyorum aşşagıda tıkladıgı yerin linkini veriyorum ;

http://i.hizliresim.com/8gQvEk.png

Bu mousenin biraz daha aşşagıya tıklamasını saglayabilir miyim? nereyi düzeltmem gerekiyor? Yardımlarınızı bekliyorum teşekkürer.


Kodlar ;

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LegendryLooter
{
public class ClickManager
{

#region Fields - Properties

[DllImport("user32.dll")]
private static extern bool SetCursorPos(int x, int y);

[DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

public const int MOUSEEVENTF_LEFTDOWN = 0x02;
public const int MOUSEEVENTF_LEFTUP = 0x04;

public Rectangle ScanBounds { get; set; }
public Point MatchArea { get; set; }
public Point[] ColorMatch { get; set; }

public int Interval { get; set; }

#endregion

public void Check()
{
Bitmap map = GetScreenshot();
for (int x = ScanBounds.Left; x < ScanBounds.Width + ScanBounds.Left; x++)
{
for (int y = ScanBounds.Top; y < ScanBounds.Height + ScanBounds.Top; y++)
{
if (x > map.Width || y > map.Height)
continue;

bool skip = false;
for (int px = 0; px < MatchArea.X; px++)
{
for (int py = 0; py < MatchArea.Y; py++)
{

Color color = map.GetPixel(x + px, y + py);
if (!CheckColor(color))
{
skip = true;
break;
}

}
if (skip)
break;
}

if (skip)
continue;


int clickX = x + MatchArea.X/2;
int clickY = y + MatchArea.Y/2;

ClickMouse(clickX, clickY);

return;

}
}
}

private bool CheckColor(Color color)
{
return color.R >= ColorMatch[0].X && color.R <= ColorMatch[0].Y &&
color.G >= ColorMatch[1].X && color.G <= ColorMatch[1].Y &&
color.B >= ColorMatch[2].X && color.B <= ColorMatch[2].Y;
}

private Bitmap GetScreenshot()
{
Rectangle s_rect = Screen.PrimaryScreen.Bounds;
Bitmap bmp = new Bitmap(s_rect.Width, s_rect.Height);
using (Graphics gScreen = Graphics.FromImage(bmp))
gScreen.CopyFromScreen(s_rect.Location, Point.Empty, s_rect.Size);

return bmp;
}

private void ClickMouse(int x, int y)
{

SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);





}


}
}
 

 

wmaraci
reklam

Batuhan Batuhan Kendine webmaster Kullanıcı
  • Üyelik 08.05.2011
  • Yaş/Cinsiyet 28 / E
  • Meslek Öğrenci
  • Konum Ankara
  • Ad Soyad B** B**
  • Mesajlar 3455
  • Beğeniler 783 / 1009
  • Ticaret 1, (%100)
Sorunu tam olarak anlayamadım ancak biraz offset vererek çözebilirsiniz sanırım. Örneğin tıkladığınız bölge 10,10 olmasına rağmen 12,12'ye tıklamış oluyorsanız x ve y değerlerine -2 şeklinde bir ekleme yapabilirsiniz. Galiba bunu göz kararı kalibre etmeniz gerekiyor.
NETEOR YILDIRAN

kişi bu mesajı beğendi.

YILDIRAN YILDIRAN WM Aracı Kullanıcı
  • Üyelik 24.04.2015
  • Yaş/Cinsiyet 35 / E
  • Meslek Turizmci
  • Konum Antalya
  • Ad Soyad E** Y**
  • Mesajlar 29
  • Beğeniler 13 / 1
  • Ticaret 1, (%100)
Öncelikle hocam ilginiz ve cevabınız için çok teşekkür ederim.

Yani demek istediğiniz şu şekilde sanırım ;

private void ClickMouse(int x, int y)
{

SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, -2, -2);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, -2, -2);





}


Ek Olarak: Yukarıda'ki şekilde denedim tabi daha farklı rakamlarla ancak durum aynı, bir oynama yok.
 

 

Batuhan Batuhan Kendine webmaster Kullanıcı
  • Üyelik 08.05.2011
  • Yaş/Cinsiyet 28 / E
  • Meslek Öğrenci
  • Konum Ankara
  • Ad Soyad B** B**
  • Mesajlar 3455
  • Beğeniler 783 / 1009
  • Ticaret 1, (%100)

YILDIRAN adlı üyeden alıntı

Öncelikle hocam ilginiz ve cevabınız için çok teşekkür ederim.

Yani demek istediğiniz şu şekilde sanırım ;

private void ClickMouse(int x, int y)
{

SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, -2, -2);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, -2, -2);





}


Ek Olarak: Yukarıda'ki şekilde denedim tabi daha farklı rakamlarla ancak durum aynı, bir oynama yok.



Kodda bulunan mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0,0); kısmı resimde de görüldüğü gibi farklı işler için ayrılmış bölümlerdir. Siz bu programda bu kısımlara ihtiyaç duymadığınız için buralara 0 geçmektesiniz, hal böyle olunca da bunu koordinat gibi algılamışsınız ki ilk başta bende öyle zannetmiştim. Offsetleri doğrudan x ve y'ye uygulamalısınız. Fonksiyonu aynı kodu tekrar tekrar kullanmayacak şekilde düzenleyecek olursak:


private void ClickMouse(int x, int y)
{
x=x-2; y=y-2;
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x,y);
mouse_event(MOUSEEVENTF_LEFTUP, x, y);
}


Bu şekilde yaptığımızda fonksiyona gelen değer direk olarak scope'a girmeden işlenir. Yani fonksiyonu çağırırken ClickMouse(10, 10); dediğimizde fonksiyon bunu 8, 8 olarak işleyecektir.
YILDIRAN

kişi bu mesajı beğendi.

wmaraci
wmaraci

YILDIRAN YILDIRAN WM Aracı Kullanıcı
  • Üyelik 24.04.2015
  • Yaş/Cinsiyet 35 / E
  • Meslek Turizmci
  • Konum Antalya
  • Ad Soyad E** Y**
  • Mesajlar 29
  • Beğeniler 13 / 1
  • Ticaret 1, (%100)

Batuhan adlı üyeden alıntı


Kodda bulunan mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0,0); kısmı resimde de görüldüğü gibi farklı işler için ayrılmış bölümlerdir. Siz bu programda bu kısımlara ihtiyaç duymadığınız için buralara 0 geçmektesiniz, hal böyle olunca da bunu koordinat gibi algılamışsınız ki ilk başta bende öyle zannetmiştim. Offsetleri doğrudan x ve y'ye uygulamalısınız. Fonksiyonu aynı kodu tekrar tekrar kullanmayacak şekilde düzenleyecek olursak:


private void ClickMouse(int x-2, int y-2)
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, x,y);
mouse_event(MOUSEEVENTF_LEFTUP, x, y);
}


Bu şekilde yaptığımızda fonksiyona gelen değer direk olarak scope'a girmeden işlenir. Yani fonksiyonu çağırırken ClickMouse(10, 10); dediğimizde fonksiyon bunu 8, 8 olarak işleyecektir. İlerleyen zamanlarda "ya bu -2'ler de neyin nesiymiş" dememeniz için tavsiyem xOFFSET ve yOFFSET isminde iki değişken tanımlayıp kullanmanızdır, bu sayede biraz daha anlaşılır bir yapıya kavuşabilirsiniz. Örneğin:


private void ClickMouse(int x-2, int y-2)
{
...
}

yerine

const int xOFFSET = 2;
const int yOFFSET = 2;
private void ClickMouse(int x-xOFFSET, int y-yOFFSET)
{
...
}



Bu şekilde yalnız derleme hatası veriyor hocam tanımlanamıyor field dışı oldugu için
 

 

Batuhan Batuhan Kendine webmaster Kullanıcı
  • Üyelik 08.05.2011
  • Yaş/Cinsiyet 28 / E
  • Meslek Öğrenci
  • Konum Ankara
  • Ad Soyad B** B**
  • Mesajlar 3455
  • Beğeniler 783 / 1009
  • Ticaret 1, (%100)

YILDIRAN adlı üyeden alıntı

Bu şekilde yalnız derleme hatası veriyor hocam tanımlanamıyor field dışı oldugu için


A evet öyle bir saçmalık olmuş, ben yapmaz diye düşünmüştüm. Şöyle yapalım?


private void ClickMouse(int x, int y)
{
x = x-2;
y = y-2;
...
}
YILDIRAN

kişi bu mesajı beğendi.

YILDIRAN YILDIRAN WM Aracı Kullanıcı
  • Üyelik 24.04.2015
  • Yaş/Cinsiyet 35 / E
  • Meslek Turizmci
  • Konum Antalya
  • Ad Soyad E** Y**
  • Mesajlar 29
  • Beğeniler 13 / 1
  • Ticaret 1, (%100)
Evet hata yok teşekkür ederim hemen test edicem :))

Ek Olarak:

Batuhan adlı üyeden alıntı

A evet öyle bir saçmalık olmuş, ben yapmaz diye düşünmüştüm. Şöyle yapalım?


private void ClickMouse(int x, int y)
{
x = x-2;
y = y-2;
...
}


Hiç bir hata vermiyor ancak yine resimde belirttiğim yere tıklıyor hocam. Şu iteme bir tıklattıramadım ya :)
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al