|
[ toxi_programer @ 14.08.2007. 17:59 ] @
| 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? |
[ mirobor @ 15.08.2007. 10:30 ] @
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?
[ mirobor @ 15.08.2007. 10:32 ] @
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);
}
[ erkan @ 15.08.2007. 10:42 ] @
@mirobor
Nije covjek mislio na to ocigledno.
Treba mu akcija klika na 'nesto' generalno u windowsu
a ne na kontrolu u okviru forme
[ maksvel @ 15.08.2007. 11:01 ] @
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
[ mirobor @ 15.08.2007. 12:13 ] @
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
[ Shevchenko @ 15.08.2007. 13:49 ] @
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 :)
[ dusty @ 15.08.2007. 13:52 ] @
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.
[ toxi_programer @ 15.08.2007. 14:22 ] @
@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
 Nije bre za virus  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...
[Ovu poruku je menjao toxi_programer dana 15.08.2007. u 15:32 GMT+1]
[ Shadowed @ 15.08.2007. 15:47 ] @
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)
[ mirobor @ 15.08.2007. 16:07 ] @
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 
[ toxi_programer @ 15.08.2007. 17:01 ] @
Eto rešenja! I to iz Holandije :)
Care, upravo to radi ono što je potrebno. Vrh!
Hvala puno.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|