Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 5.020 pregleda

Najnovija ↓

Kako windowsu da kažem "klikni" 14.08.2007. u 18:59 · pre 234 meseca #1
Pozdrav svima.

Levi taster miša, kad se dva puta stisne, pokreće program/šta_već na čijoj se ikonici nalazi kursor. Mene interesuje kako da omogućim iz koda da se inicira taj click/double click/right_click događaj. OK, mogu da podignem OnClick event za neku kontrolu u mojem programu ali kako to da se izvede na nivou celog windowsa? Recimo da kursor stoji iznad "start" dugmeta i ja hoću u tom trenutku windowsu da "kažem": "sad klikni"... :)


I još jedno pitanje - kako da dobijem memorijsku veličinu neke klase?
Potpis
Expert Opinions - Niche Articles
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 11:30 · pre 233 meseca #2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'ovdje dolazi tvoja procedura
End Sub

Private Sub Button1_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseHover
'ako stanes misom iznad dugmeta click event startuje
Button1_Click(sender, e)

End Sub


Jesi li mislio na nesto ovako?
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 11:32 · pre 233 meseca #3
U C#

private void Button1_Click(object sender, System.EventArgs e) {
// ovdje dolazi tvoja procedura
}

private void Button1_MouseHover(object sender, System.EventArgs e) {
// ako stanes misom iznad dugmeta click event startuje
Button1_Click(sender, e);
}

Re: Kako windowsu da kažem "klikni" 15.08.2007. u 11:42 · pre 233 meseca #4
@mirobor

Nije covjek mislio na to ocigledno.
Treba mu akcija klika na 'nesto' generalno u windowsu
a ne na kontrolu u okviru forme
Potpis
Samo se budala saplice na kamen iza sebe.
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 12:01 · pre 233 meseca #5
Hm, za klikove i slično pretpostavljam da moraš pogledati WinAPI.
Kod veličine klase pretpostavljam da si mislio na veličinu objekta? Njegova veličina je skup member-a i drugih objekata koji se inicijalizuju. Trebalo bi da radi funkcija sizeof - za detalje progooglaj... - možda http://msdn2.microsoft.com/en-us/library/y3ybkfb3.aspx ili slično
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 13:13 · pre 233 meseca #6
Citat:
Nije covjek mislio na to ocigledno.
Treba mu akcija klika na 'nesto' generalno u windowsu
a ne na kontrolu u okviru forme


To bi bio pravi rshum, ako to moze vidim svrhu samo za pravljenje nekakvog virusa.
Start > Run > cmd > format c: hehe
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 14:49 · pre 233 meseca #7
Jedini nacin da ovo izvedes je pomocu WinAPI-a. Jedna od ideja, naglasavam ideja, je da posaljes poruku dvoklika kernelu. Bio bih konkretniji ali davno sam radio sa ovim pa ne mogu da se setim detalja. Inace kosricenje WinAPI-a je vec Unmanaged kod, a cisto .NET resenje ne znam da li postoji :)
Potpis
Shoot for the moon. Even if you miss, you'll land among the stars.
Les Brown
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 14:52 · pre 233 meseca #8
Iz C# neces moci skoro pa nista, moraces da radis invoke API funkcija. Secam se da se to moglo uraditi na dva nacina, jedan je ka vidljivim prozorima (koji nisu zaklonjeni) a drugi je prema bilo kojem prozoru. U oba slucaja na kraju pozivas PostMessage/SendMessage nad dobijenim hendlom prozora.

U prvom pristupu koristis f-ju WindowFromPoint, koja ce ti vratiti hendl na prozor kome pripadaju koordinate. Ponekad je to dovoljno, npr. simulacija klika na WinAmp-ov play, pod uslovom da je bash na tim koordinatama play dugme i da nije ispod nekog drugog prozora, ali za neke druge slucajave nije, zaklonjen ili minimizovan prozor. U tom slucaju koristis drugi pristup, a to je da nadjes prozor po nekom kriterijumu - imenu, imenu klase, hendlu instance, ID-u child kontrole ... ili kombinacijom. Pretragu pocinjes od desktop-a, sa GetDesktop() funkcijom dobijas desktopov HWND, a zatim pretrazujes sve prozore koji mu pripadaju preko EnumChildWindows. Uzmi u obzir da svaki od dobijenih prozora ima svoje child prozore.

Sve ovo mi izgleda da je veoma tesko uraditi u C#. Sta hoces da napravis ?
Citat:
I još jedno pitanje - kako da dobijem memorijsku veličinu neke klase?

Ne mozes dobiti velicinu klase, ali mozes dobiti velicinu instance klase preko interop-a kao sto je Maskvel rekao ili da tu klasu napravis da je serijabilna i serijalizujes objekat u memory stream i onda vidis koliki je.
Citat:
To bi bio pravi rshum, ako to moze vidim svrhu samo za pravljenje nekakvog virusa

Ako se 'virus' vec pokrenuo pod korisnikovim security kontekstom, nema potrebe da zonglira sa prozorima kada moze direktno da pokrene neki proces. Simulacija klika misem je meni bila jedino korisna kada sam pravio daljinski upravljac preko serijskog porta za upravljanje WinAmp-om i MediaPlayer-om. Samo, ja sam hardkodovao imena i klase WinAmp-a i MediaPlayer-a, kao i njenih prozora dugmadi za play/pause/stop i nije moglo da se radi sa vise instanci jedne aplikacije.
Potpis
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 15:22 · pre 233 meseca
izmenjeno 1 put, poslednji put toxi_programer 15.08.2007. u 15:32
  1. toxi_programer15.08.2007. u 15:32zapis iz teksta poruke
#9
@mirobor, @mirobor
Bah, lako je to :) Baš kao što reče @erkan ...


Što se tiče veličine... Nisam stigao da odogovorim da sam to "rešio". Naime, kao što @maksvel reče, može se koristiti Marshal.SizeOf ali to samo za strukture i druge unmanaged objekte. Ima takođe i operator sizeof ali i za njega isto važi. A meni je bilo potrebna veličina managed objekta. Evo kako sam to uradio( mada zahteva da objekat bude sa atributom Serializable):

Code:

BinaryFormatter bFormatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();

bFormatter.Serialize(ms, myObject);

MessageBox.Show(ms.Length.ToString());



E sad, to za "klik" windowsu. @Shevchenko, nije problem što se mora koristiti WinAPI. A gde bih mogao da pogledam kako se šalje ta poruka kernelu? Ima ovaj sajt: http://custom.programming-in.net tu su prikazane(valjda) sve WinAPI f-je i kao se pozivaju iz neta. Ali ja ne znam kakvu funkciju da tražim :(


@mirobor
:D Nije bre za virus :D Poenta je da sa svog kompa mogu da uradim šta god ja hoću na nekom drugom kompu - recimo da se njegov kursor kreće onako kako ja pomeram mog miša i to sam uradio i još što šta. Ali kad ja kliknem treba i na tom remote računaru da se klikne. To je program koji treba da omogući da tvom "glupom net drugaru" nešto "na udaljeno" popraviš na kompu. Znam da ima takvih programa i uz sam win, ali poenta je da ja to uradim i naučim nešto :)

------------------------------
DOPUNA:
@dusty
Nevideh tvoju poruku.
Da, to za memoriju sam uradio baš na taj način :)
A što se tiče "klitanja", videću nešto da uradim na ovaj način što si ti rekao.


Hvala vam...
Potpis
Expert Opinions - Niche Articles
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 16:47 · pre 233 meseca #10
Postoji Win32 API koji sluzi upravo za to, ali se ne secam dobro kako se zove, nesto kao SendMouseEvent ili tako nesto. (ima vise njih kojima se moze postici isti efekat)
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Kako windowsu da kažem "klikni" 15.08.2007. u 17:07 · pre 233 meseca #11
Citat:
using System;
using System.Runtime.InteropServices;
...


// usingAPI for mouse governing and other possibilities




enum Messages{WM_LBUTTONDOWN = 0x0201, WM_LBUTTONUP = 0x0202};
const int MK_LBUTTON = 0x0001;
[DllImport("User32.dll")]
static extern int SendMessage(IntPtr hWnd, Messages uMsg, int wParam, IntPtr lParam);


[DllImport("User32.dll")]
static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);

//as a matter of convenience, use create enumeration with necessary flags (constants), which define actions of mouse:

[Flags]
enum MouseFlags
{
Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008,
RightUp = 0x0010, Absolute = 0x8000};
/// <summary>
///Click In some place of screen
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
private void TestMouse(int x, int y)
{

mouse_event(MouseFlags.Absolute | MouseFlags.Move, x, y, 0, UIntPtr.Zero);
mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown , x, y, 0, UIntPtr.Zero);
mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, x, y, 0, UIntPtr.Zero);

}






Vidi imas li sta koristi od ovoga, ako sam opet promasio j****a izvini :-)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme