Avatar billede semiprofkode Nybegynder
17. januar 2006 - 19:24 Der er 13 kommentarer

sende et tastetryk globalt i windows

Hvordan sender man et tastetryk globalt i windows, så det kommer i hvilketsomhelst program, ligesom en makro ?
Avatar billede sovsekoder Nybegynder
17. januar 2006 - 20:29 #1
følgende kode sætter fokus i en textbox (textbox1) og sender "globale" keyboard events : "SOVS":

//MSDN hjælp til keybd_event : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/keybd_event.asp
            //VK_KEYS her:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
            textBox1.Focus();
            const int VK_S = 0x53;
            const int VK_O = 0x4f;
            const int VK_V = 0x56;
            const int KEYEVENTF_KEYUP = 0x0002;
            keybd_event(VK_S, 0, 0,0);
            keybd_event(VK_S, 0, KEYEVENTF_KEYUP,0);
            keybd_event(VK_O, 0, 0,0);
            keybd_event(VK_O, 0, KEYEVENTF_KEYUP,0);
            keybd_event(VK_V, 0, 0,0);
            keybd_event(VK_V, 0, KEYEVENTF_KEYUP,0);
            keybd_event(VK_S, 0, 0,0);
            keybd_event(VK_S, 0, KEYEVENTF_KEYUP,0);
Avatar billede sovsekoder Nybegynder
17. januar 2006 - 20:31 #2
keybd_event kaldes 2 gange, een gang for "tryk" og een gang for "slip". Se mine msdn links for "specielle" taster som "tab" scroll lock osvosvo..

hvis du har brug for at læse en tasts tilstand skal du bruge et andet API kald, tror det hedder noget med GetKeyState, eller noget "logisk" i den stil ;)
Avatar billede sovsekoder Nybegynder
17. januar 2006 - 20:33 #3
hex værdierne for virtual keys er de samme som det store bogstav, altså VK_S = (int)'S';osvosv..
Avatar billede semiprofkode Nybegynder
18. januar 2006 - 16:05 #4
msdn siger i linket:

Windows NT/2000/XP:This function has been superseded. Use SendInput instead.
Avatar billede sovsekoder Nybegynder
18. januar 2006 - 20:59 #5
lol, ja det er sq rigtigt... det lyder til at være den "helt" rigtige vej så!!

godt set!
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 09:40 #6
er det lukke tid for denne ?
Avatar billede semiprofkode Nybegynder
25. januar 2006 - 09:58 #7
Det er stadig ikke lykkedes mig at bruge metoden i c#. Det er en c++ metode, hvordan gør jeg i c# ?
Avatar billede semiprofkode Nybegynder
25. januar 2006 - 10:02 #8
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 10:21 #9
komplet eksempel på den gamle måde, dvs ved. brug af keyb_event:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsApplication24
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.ComponentModel.Container components = null;

        public Form1() {InitializeComponent();}

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) {components.Dispose();}
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent()
        {
            this.button1 = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            this.button1.Location = new System.Drawing.Point(32, 32);
            this.button1.Name = "button1";
            this.button1.TabIndex = 0;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.textBox1.Location = new System.Drawing.Point(32, 72);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "textBox1";
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.button1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
        }

        [STAThread]
        static void Main(){Application.Run(new Form1());}

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,UIntPtr dwExtraInfo);

        private void button1_Click(object sender, System.EventArgs e)
        {
            textBox1.Focus();
            UIntPtr dwExtraInfo = new UIntPtr(0);
            const int VK_S = 0x53;
            const int VK_O = 0x4f;
            const int VK_V = 0x56;
            const int KEYEVENTF_KEYUP = 0x0002;
            keybd_event(VK_S, 0, 0, dwExtraInfo);
            keybd_event(VK_S, 0, KEYEVENTF_KEYUP, dwExtraInfo);
            keybd_event(VK_O, 0, 0, dwExtraInfo);
            keybd_event(VK_O, 0, KEYEVENTF_KEYUP, dwExtraInfo);
            keybd_event(VK_V, 0, 0, dwExtraInfo);
            keybd_event(VK_V, 0, KEYEVENTF_KEYUP, dwExtraInfo);
            keybd_event(VK_S, 0, 0, dwExtraInfo);
            keybd_event(VK_S, 0, KEYEVENTF_KEYUP, dwExtraInfo);
        }
    }
}
Avatar billede sovsekoder Nybegynder
25. januar 2006 - 10:24 #10
se evt. www.pinvoke.net, hvis du vil bruge SendInput istedet for ... skriv evt. hvis du skal ha' lidt hjælp til at komme igang med den... den kræver lidt mere kode.
Avatar billede sovsekoder Nybegynder
27. januar 2006 - 14:14 #11
hvordan står det ellers til :D ?
Avatar billede semiprofkode Nybegynder
27. januar 2006 - 14:22 #12
Det lykkedes mig med sendInput. Lavede en klasse selv, kan lige så godt smide den her til glæde for andre......


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MOUSEMOVE
{
    /// <summary>
    /// Summary description for Keyboard.
    /// </summary>
    public class KeyboardApi
    {

       

        public KeyboardApi()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        [DllImport("user32.dll")]
        static extern uint SendInput(uint nInputs, INPUT [] pInputs, int cbSize);
        [StructLayout(LayoutKind.Explicit)]
            struct INPUT
        {
            [FieldOffset(0)] public int type;
            [FieldOffset(4)] MOUSEINPUT mi;
            [FieldOffset(4)] public KEYBDINPUT ki;
            [FieldOffset(4)] HARDWAREINPUT hi;
        }
        [StructLayout(LayoutKind.Sequential)]
            struct MOUSEINPUT
        {
            int dx;
            int dy;
            int mouseData;
            int dwFlags;
            int time;
            IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
            struct KEYBDINPUT
        {
            public short wVk;
            public short wScan;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
            struct HARDWAREINPUT
        {
            int uMsg;
            short wParamL;
            short wParamH;
        }

        public void sendKeyDown(Keys key)
        {
            KEYBDINPUT myKey=new KEYBDINPUT();
            myKey.wVk=(short)key;
            myKey.dwFlags = KEYEVENTF_KEYDOWN;
            sendKeyboardInput(myKey);
        }

        public void sendKeyUp(Keys key)
        {
            KEYBDINPUT myKey=new KEYBDINPUT();
            myKey.wVk=(short)key;
            myKey.dwFlags = KEYEVENTF_KEYUP;
            sendKeyboardInput(myKey);
        }

        private static int KEYEVENTF_KEYUP = 0x2;
        private static int KEYEVENTF_KEYDOWN = 0x0;

       


        private void sendKeyboardInput(KEYBDINPUT kInput)
        {
            INPUT [] inputs = new INPUT[1] {new INPUT()};
            inputs[0].ki = kInput;
            inputs[0].type = 1;
           
            uint ret = SendInput((uint)inputs.Length,inputs,Marshal.SizeOf(inputs[0]));
            if ( ret != (uint)inputs.Length)
                throw new ApplicationException("SendInput error: " + Marshal.GetLastWin32Error().ToString());

            Console.WriteLine("ok....");
        }

        public enum VK : short
        {
            SHIFT = 0x10,
            CONTROL = 0x11,
            MENU = 0x12,
            ESCAPE = 0x1B,
            BACK = 0x08,
            TAB = 0x09,
            RETURN = 0x0D,
            PRIOR = 0x21,
            NEXT = 0x22,
            END = 0x23,
            HOME = 0x24,
            LEFT = 0x25,
            UP = 0x26,
            RIGHT = 0x27,
            DOWN = 0x28,
            SELECT = 0x29,
            PRINT = 0x2A,
            EXECUTE = 0x2B,
            SNAPSHOT = 0x2C,
            INSERT = 0x2D,
            DELETE = 0x2E,
            HELP = 0x2F,
            NUMPAD0 = 0x60,
            NUMPAD1 = 0x61,
            NUMPAD2 = 0x62,
            NUMPAD3 = 0x63,
            NUMPAD4 = 0x64,
            NUMPAD5 = 0x65,
            NUMPAD6 = 0x66,
            NUMPAD7 = 0x67,
            NUMPAD8 = 0x68,
            NUMPAD9 = 0x69,
            MULTIPLY = 0x6A,
            ADD = 0x6B,
            SEPARATOR = 0x6C,
            SUBTRACT = 0x6D,
            DECIMAL = 0x6E,
            DIVIDE = 0x6F,
            F1 = 0x70,
            F2 = 0x71,
            F3 = 0x72,
            F4 = 0x73,
            F5 = 0x74,
            F6 = 0x75,
            F7 = 0x76,
            F8 = 0x77,
            F9 = 0x78,
            F10 = 0x79,
            F11 = 0x7A,
            F12 = 0x7B,
            OEM_1 = 0xBA, // ',:' for US
            OEM_PLUS = 0xBB, // '+' any country
            OEM_COMMA = 0xBC, // ',' any country
            OEM_MINUS = 0xBD, // '-' any country
            OEM_PERIOD = 0xBE, // '.' any country
            OEM_2 = 0xBF, // '/?' for US
            OEM_3 = 0xC0, // '`~' for US
            MEDIA_NEXT_TRACK = 0xB0,
            MEDIA_PREV_TRACK = 0xB1,
            MEDIA_STOP = 0xB2,
            MEDIA_PLAY_PAUSE = 0xB3,
            LWIN =0x5B,
            RWIN =0x5C
        }


    }
}
Avatar billede sovsekoder Nybegynder
27. januar 2006 - 22:18 #13
super!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester