Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

KeyEventHandler


Rekomendowane odpowiedzi

Opublikowano

Witam.

Mam taki kodzik:

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Timers;
using System.Drawing.Imaging;
using System.Threading;

namespace Nortore
{
    public partial class Form3 : Form
    {
        System.Timers.Timer t = new System.Timers.Timer();
        System.Timers.Timer t2 = new System.Timers.Timer();

        string path3;
        string namePath;

        public int TurnOnOff;

        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            this.Left = 1300;
            screen_Start();
            this.BeginInvoke(new EventHandler(delegate
            {
                this.Hide();
            }));
        }

        public void KeyDown_Turn_On()
        {
            if (TurnOnOff == 1)
            {
                this.KeyDown +=
                    new System.Windows.Forms.KeyEventHandler(KeyDown_Screen);

                this.KeyPreview = true;

                MessageBox.Show("Odzew KeyDown");
            }
        }


        void KeyDown_Screen(object sender, KeyEventArgs e)
        {
            Form4 frm4 = new Form4();
            if (e.KeyCode == frm4.eP.KeyCode)
            {
                MessageBox.Show("Enter Key Pressed " + e.KeyCode.ToString());
            }
        }

        public void pic_Img_Change(string imgPath)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = Image.FromFile(imgPath);
        }

        private void screen_Start()
        {
            t.Interval = 300000;
            t.Elapsed += new ElapsedEventHandler(screen_To_Shot);
            t.Start();
        }

        public void screen_To_Shot(object source, ElapsedEventArgs e)
        {
            Rectangle bounds = Screen.GetBounds(Point.Empty);
            Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
            Graphics.FromImage(bitmap).CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
            path3 = Path.GetDirectoryName(Application.ExecutablePath) + "\\" + Application.ProductName + "\\" + "screens" + "\\screen" + " - " + DateTime.Now.ToString("dd-MM-yyyy h-mm-ss") + ".jpg";
            bitmap.Save(path3, ImageFormat.Jpeg);
            namePath = "screen" + " - " + DateTime.Now.ToString("dd-MM-yyyy h-mm-ss") + ".jpg";
            this.BeginInvoke(new EventHandler(delegate
            {
                ambiance_Label1.Text = namePath;
            }));
            pic_Img_Change(path3);
            this.BeginInvoke(new EventHandler(delegate
            {
                this.Show();
            }));
            Thread.Sleep(2000);
            this.BeginInvoke(new EventHandler(delegate
            {
                this.Hide();
            }));
        }
    }
}

 

i nie działa mi, że jak wcisne dany przycisk to

się nic nie dzieje.

Opublikowano

Yh, pomijając fakt, że kod który dajesz jest bardzo wystarczający do czegokolwiek (i jakże czytelny)... (wybacz moją zgryźliwość, ale skąd mam wiedzieć co w ogóle robi Forma form4 i odwołania do niej)

Z tego co zauważyłem to chcesz zbudować aplikację do shootowania ekranu - tak czy inaczej będziesz do tego potrzebował global key hook czyli skrót klawiszowy dostępny z każdego miejsca, tutaj wytłumaczył to ktoś w niemiłosiernie prosty sposób: 

http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

Pozdrawiam

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber beim Universum bin ich mir nicht ganz sicher."
~A. Einstein

Opublikowano

Masz tu form4, jak chcesz:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Nortore
{
    public partial class Form4 : Form
    {
        public KeyEventArgs eP;
        public Form4()
        {
            InitializeComponent();
        }

        private void Form4_Load(object sender, EventArgs e)
        {
            this.KeyDown +=
                new System.Windows.Forms.KeyEventHandler(ambiance_Button_11_KeyDown);
        }

        void ambiance_Button_11_KeyDown(object sender, KeyEventArgs e)
        {
            eP = e;
            ambiance_Button_11.Text = e.KeyCode.ToString();
            this.KeyPreview = false;

            if (e.KeyCode == e.KeyCode)
            {
                MessageBox.Show("Enter Key Pressed " + e.KeyCode.ToString());
            }
        }

        private void ambiance_Button_11_Click(object sender, EventArgs e)
        {
            this.KeyPreview = true;
        }

        private void ambiance_Toggle1_ToggledChanged()
        {

        }

        private void ambiance_Toggle2_ToggledChanged()
        {
            Form3 frm3 = new Form3();
            frm3.KeyDown_Turn_On();
            frm3.TurnOnOff = 1;
        }
    }
}

Form3 uruchamiam w Form1

Opublikowano

Przenieś linie

this.KeyPreview = true;
this.KeyDown += new System.Windows.Forms.KeyEventHandler(KeyDown_Screen);              

do konstruktora klasy aby wyglądał tak:

public Form3()
        {
            InitializeComponent();
            this.KeyPreview = true;
            this.KeyDown += new System.Windows.Forms.KeyEventHandler(KeyDown_Screen);
        }
 

 

  • 1 miesiąc temu...
Opublikowano

Wybaczcie iż odświeżam, lecz mam podobny problem.

 

Kod z pierwszej odpowiedzi, rzeczywiście działa, niestety przy naciśnięciu wybranego klawisza, np. "A" funkcjonalność tego przycisku w innych programach jest wyłączona.

 

Potrzebuję czegoś co będzie:

- działać bez sfocusowanego "Form"/programu,

- sprawdzać czy został wciśnięty dany przycisk (bądź kombinacja przycisków, np. CTRL+SHIFT+F3),

- nie będzie integrować w funkcjonalność przycisku/ów w innych programach.

 

Jak takie coś osiągnąć?

Opublikowano

Wybaczcie iż odświeżam, lecz mam podobny problem.

 

Kod z pierwszej odpowiedzi, rzeczywiście działa, niestety przy naciśnięciu wybranego klawisza, np. "A" funkcjonalność tego przycisku w innych programach jest wyłączona.

 

Potrzebuję czegoś co będzie:

- działać bez sfocusowanego "Form"/programu,

- sprawdzać czy został wciśnięty dany przycisk (bądź kombinacja przycisków, np. CTRL+SHIFT+F3),

- nie będzie integrować w funkcjonalność przycisku/ów w innych programach.

 

Jak takie coś osiągnąć?

GetAsyncKeyState będzie okej ;).

8LTfBGw.jpg

  • 2 tygodnie później...
Opublikowano

Nie wiem czy coś źle zrobiłem, ale podobnie funkcjonalność przycisku jest wyłączona. Przykładowo ustawię sobie, że chce, aby program robił coś gdy wcisnę "CTRL+V", to rzeczywiście działa - lecz komenda 'wklej' niestety jest wyłączona.

 

using System.Runtime.InteropServices;
//
[DllImport("user32.dll")]
public static extern bool RegisterHotKey(IntPtr hWnd,int id,int fsModifiers,int vlc);
[DllImport("user32.dll")]
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

private void Form1_Load(object sender, EventArgs e) {
//2 = control,
RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 2, (int)'V');
}

protected override void WndProc(ref Message m) {
if (m.Msg == 0x0312) {
Console.Write("Wcisnales ctrl+v.");
}
base.WndProc(ref m);
}

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...