Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Skloniti fokus sa forme, C#, i ne vraćati ga ...

[es] :: .NET :: .NET Desktop razvoj :: Skloniti fokus sa forme, C#, i ne vraćati ga ...

[ Pregleda: 3118 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ivan Vasić

Član broj: 14756
Poruke: 631
*.eunet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Skloniti fokus sa forme, C#, i ne vraćati ga ...12.03.2004. u 00:12 - pre 244 meseci
Jel bi znao neko da mi pomogne oko C# aplikacije imam sledeći problem :
Komandom SendKeys simuliram tastaturu recimo u notepad-u. SendKeys aktiviram pritiskom na dugme na mojoj formi.
Problem je :

Kako održati fokus IZVAN moje forme (u ovom slučaju u notepadu) tako da mogu više puta da kliknem na to dugme (ili više različitih) i to nastavi da piše u notepad-u ?

Nadam se da ste me skontali. Znači ne mogu da bukvalno sklonim fokus sa moje forme i da ga ne vratim kad ponovo kliknem na nju.
Moguće ? Moguće sigurno ali kako ?

Thnx

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...12.03.2004. u 10:04 - pre 244 meseci
Ne znam koliko si upoznat sa low-level systemom upravljanja prozorima u WIndowsu. Elem, ukratko, svaki prozor (a tu spada sve što se vidi, uključujući i kontrole) ima svoju "klasu" (pod navodnicima), a svaka klasa ima registrovanu svoju tzv. windows message proceduru koja je dobijala porukice od strane svog thread-a koji ih dobija od Windows-a za skoro sve i svašta. Nisam siguran da možeš da odbiješ fokus pošto ti njega daje sam Windows (samo te obavesti sa WM_ACTIVATEAPP), ali možda možeš da posle obrade dugmeta pošalješ poruku da se povlačiš iz trke, tako što ćeš u sopstveni glavni thread ubaciti WM_KILLFOCUS poruku (pogledaj MSDN za wParam i lParam vrednosti). To bi trebalo da natera tvoju aplikaciju da prepusti focus prethodno aktivnoj, dakle notepad-u

E sad problem, izuzev nekoliko baš prostih poruka (PAINT, MOUSEMOVE, itd) koje su izvedene kao event-i forme, SVE OSTALE poruke moraš ručno da pratiš. Možda će ti ovo parče koda pomoći (mora biti u okviru klase forme):

Code:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
        protected override void WndProc(ref Message m) 
        {
            // Listen for operating system messages.
            switch (m.Msg)
            {
                // The WM_ACTIVATEAPP message occurs when the application
                // becomes the active application or becomes inactive.
                case WM_ACTIVATEAPP:

                    // The WParam value identifies what is occurring.
                    bool appActive = (((int)m.WParam != 0));

                    // ovde radis nesto kad se tvoja aplikacija (ne forma) aktivira

                    break;                
            }
            base.WndProc(ref m);
        }


Ovaj kod nema direktne veze sa onim što tražiš ali ti je čisto reper kako se presreću WIndows poruke u formi, pošto postoje izvesne security začkoljice oko pozivanja unmannaged koda (koji se nalazi u base.WndProc)

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.107.eunet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...12.03.2004. u 10:49 - pre 244 meseci
Nisam upoznat sa low/level systemom upravljanja prozora .... Ali tvoje objašnjenje je bilo i više nego dovoljno...
Mislim da si mi dao dovoljno elemenata da rešim problem što ću i da pokušam.
Pogledaću MSDN za one parametre, a ako sam dobro razumeo trebalo bi da u onom delu case WM_ACTIVATEAPP:, 'ručno' ubijem fokus i to je to, jel da ?

Jedno pitanjce, da li će se fokus onda vratiti na aplikaciju koja je prethodno bila aktivna ili na neku slučajno odabranu ? Pretpostavljam da će na prethodnu al' ipak da pitam....

Ako neko slučajno ima konkretno rešenje bio bi vie nego zahvalan da pogledam....
 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.EUnet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...12.03.2004. u 18:00 - pre 244 meseci
Citat:
mmix:
tako što ćeš u sopstveni glavni thread ubaciti WM_KILLFOCUS poruku (pogledaj MSDN za wParam i lParam vrednosti). To bi trebalo da natera tvoju aplikaciju da prepusti focus prethodno aktivnoj, dakle notepad-u


Jel možeš da mi daš primer kako da ubacim msg WM_KILLFOCUS ?
I to bi trebalo da ubacim "otprilike" tamo gde si dao komentar u kodu da treba da upišem nešto ?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...12.03.2004. u 23:53 - pre 244 meseci
Nisam se davno igrao sa ovim queue-ovima, pa sam malo zarđao. Mozda sutra nahvatam malo vremena ako bude lose vreme napolju pa i odradim neki primer, bez garancija.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...13.03.2004. u 10:42 - pre 244 meseci
Ok, našao sam i mnogo jednostavniji metod koji ne uključuje čačkanje message queue-a. Bazira se na tri API funkcije. Evo kod iz forme (forma ima jedno dugme button1):

Code:

...
using System.Runtime.InteropServices;

...
    public class Form1 : System.Windows.Forms.Form
    {
        [DllImport("user32.dll")]
        public static extern int FindWindow(
            [MarshalAs(UnmanagedType.LPStr)] string lpClassName, 
            [MarshalAs(UnmanagedType.LPStr)] string lpWindowName);
        [DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(int hWnd);
        [DllImport("user32.dll")]
        public static extern int SetActiveWindow(int hWnd);

        private System.Windows.Forms.Button button1;

...

        private void button1_Click(object sender, System.EventArgs e)
        {
            int hW = FindWindow("Notepad", null);
            SetForegroundWindow(hW);
            SetActiveWindow(hW);
            SendKeys.Send(@"A");
            SendKeys.Flush();
        }



Začkoljica: Ako imaš više otvorenih Notepad-a, nema garancije koji će biti aktiviran.

[mmix: izbacio sam WM_KILLFOCUS konstantu, nije potrebna]
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.eunet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...13.03.2004. u 11:43 - pre 244 meseci
E, hvala ti. Ovo je super samo ima malecki problem. Ja sam notepad naveo kao primer. Suština problema je da se fokus prebaci na PRETHODNO AKTIVNI prozor ' što ne mora da bude notepad. Što bi značilo ne mogu da radim FindWindow("notepad").
Ali možda ima fora da se dobije naziv prethodno aktivnog pa da ga upotrebim u FIndWIndow ?

Možda ovako nešto :
http://msdn.microsoft.com/libr...dcolcolgetforegroundwindow.asp

može da se pozove čim moja forma izgubi fokus ?

 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.42.eunet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...13.03.2004. u 13:16 - pre 244 meseci
Ok. Uspeo sam nešto da uradim.
Deklarisao sam GetForegroundWindow() iz user32.dll.
Dodao sam mojoj formi u event (form_deactivate) da mi zapamti prozor trenutno aktivan i posle taj handle iskoristio za SetForegroundWindow po kliku na button.

To funkcioniše. Ali sa malim problemima. Ako je notepad u pitanju nema problema, ali uzimam za primer Internet Explorer.
Kad pozovem SetForegroundWindow on vrati fokus na IE ali ne tamo gde je bio kursor !!! Što znači da skoro uvek upisuje tekst u Address bar a ne tamo gde je bio kursor.

Kako ovo ?

Možda je ipak bolje da iskoristim KILLFOCUS pre nego što ga vrati na moju formu. ?
Najbolje je da pogledate kao primer ONSCREENKEYBOARD u WindowsXP. Identičan posao radi.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...13.03.2004. u 18:37 - pre 244 meseci
Citat:
ivan@elfak:
Najbolje je da pogledate kao primer ONSCREENKEYBOARD u WindowsXP. Identičan posao radi.

Dobra ideja, šta više odlična.
Sad nema šanse, vikend je, ali kad se dočepam development mašine u ponedeljak iskoristiću SPY++ da provalim kako ONSCREENKEYBOARD uspeva da se izmigolji od prenosa fokusa. Red je da i ja naučim nešto

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.27.eunet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...13.03.2004. u 19:47 - pre 244 meseci
Ok. Hvala ti, nego iskopao sam još jedan primer na netu:

http://www.visual-basic-data-m...Forum/showpost.aspx?PostID=964

Izgleda mi na prvi pogled, da ne "ubija" fokus tastature nego da hvata klik miša i sprečava ga ili tako nešto. Nisam baš najbolje sa VB ali probaću da prostudiram.


 
Odgovor na temu

Ivan Vasić

Član broj: 14756
Poruke: 631
*.61.EUnet.yu

Jabber: ivasic@elitesecurity.org


Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...14.03.2004. u 11:36 - pre 244 meseci
Evo pročačkao sam malo...
Uspeo sam da "hook"-ujem miša. Evo parče mog koda, metod koji obradjuje hook :

Code:

public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
    if (nCode < 0)
    {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    else
    {    
        if(wParam.ToInt32() == 513)
        {
            SendKeys.Send("A");
            SendKeys.Flush();            
            return 1;  
        }

    return CallNextHookEx(hHook, nCode, wParam, lParam); 
    }
}


Ovo upada u beskonačnu petlju. Možda Windows misli da aplikacija nije primila poruku pa ponavlja za wParam - WM_LBUTTONDOWN ?
A kad izbacim SendKeys komandu i ubacim npr. da ispiše koordinate miša u titlebar, sve je OK. Izgleda da SendKeys pravi frku.

Onaj VB primer je OK, samo kad bi proradio...

U VB primeru ispod SendKeys ubačeno je "RaiseEvent MouseDown()", koji je ekvivalent u C# za RaiseEvent ?
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Skloniti fokus sa forme, C#, i ne vraćati ga ...15.03.2004. u 20:00 - pre 244 meseci
Hm, ovo nisam probao, ali mozda radi:

Kada neko klikne prvi put na tvoj prozor, i on dobije focus, ti ces dobiti WM_SETFOCUS poruku. wParam te poruke sadrzi handle od prozora koji je upravo izgubio fokus. Mozda bi mogao da mu posle vratis fokus sa setfocus kada zavrsis.

Samo pazi, ovo je pipavo - ne treba da udjes u beskonacnu petlju, treba da zapamtis tu vrednost koju si dobio i da je iskoristis kasnije, itd.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Skloniti fokus sa forme, C#, i ne vraćati ga ...

[ Pregleda: 3118 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.