Virtuální klávesnice   zodpovězená otázka

C#

Dobrý den,

chtěl bych vytvořit program kterému se zadá text a on by podle písmenek mačkal klávesy. Proč tímto způsobem? Chtěl bych aby to psalo do programu na kterém je focus. Např: v mém programu bych zadal, aby psal text a teď když bych klikl do jakéhokoli programu do textboxu nebo na cokolik co přijíma text tak by to tam psalo.

Myslím, že to bude buď hodně složité nebo to ani nepůjde, ale proto se taky ptám. Předem děkuji za odpovědi.

PS nešlo by o žádný záškodnický program, jen bych si chtěl ulehčit práci s programem All ten fingers, jestli mi rozumíte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den, zde bude potřeba využít API funkce. V jedné aplikaci jsem řešil stejný problém a vyřešil jsem ho s pomocí googlu takto:

Deklarace API a vytvoření funkce, která bude systému posílat zprávu o stisku tlačítka:

Imports System.Runtime.InteropServices

Module api
    Sub New()
    End Sub
    Public Const INPUT_KEYBOARD As Integer = 1
    Public Const KEYEVENTF_KEYUP As UInteger = &H2

    <DllImport("user32.dll", SetLastError:=True)> _
    Public Function SendInput(ByVal nInputs As UInteger, ByVal pInputs As Input_32bitSyst(), ByVal cbSize As Integer) As UInteger
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Public Function SendInput(ByVal nInputs As UInteger, ByVal pInputs As Input_64bitSyst(), ByVal cbSize As Integer) As UInteger
    End Function

    <StructLayout(LayoutKind.Explicit)> _
    Public Structure Input_32bitSyst
        <FieldOffset(0)> _
        Public type As Integer
        <FieldOffset(4)> _
        Public ki As KeyboardInput_32bitSyst
    End Structure

    <StructLayout(LayoutKind.Sequential, Size:=24)> _
    Public Structure KeyboardInput_32bitSyst
        Public wVk As UShort
        Public wScan As UShort
        Public dwFlags As UInteger
        Public time As UInteger
        Public dwExtraInfo As IntPtr
    End Structure


    <StructLayout(LayoutKind.Explicit)> _
    Public Structure Input_64bitSyst
        <FieldOffset(0)> _
        Public type As Integer
        <FieldOffset(8)> _
        Public ki As KeyboardInput_64bitSyst
    End Structure

    <StructLayout(LayoutKind.Sequential, Size:=28)> _
    Public Structure KeyboardInput_64bitSyst
        Public wVk As UShort
        Public wScan As UShort
        Public dwFlags As UInteger
        Public time As UInteger
        Public dwExtraInfo As IntPtr
    End Structure
End Module


Public Module KeyboardSimulation
    Sub New()
    End Sub
    Public Sub Simulate(ByVal ParamArray keys As UShort())

        If IntPtr.Size = 4 Then
            Dim input As api.Input_32bitSyst() = New api.Input_32bitSyst(keys.Length - 1) {} '32 bitová verze 

            'pole kódů kláves 
            For i As Integer = 0 To keys.Length - 1
                input(i).type = api.INPUT_KEYBOARD 'stisknutí

                input(i).ki.wVk = keys(i) 'konkrétní klávesa
            Next

            api.SendInput(3, input, Marshal.SizeOf(GetType(api.Input_32bitSyst)))  'odeslat zprávu o stisknutí všech kláves v poli 

            For i As Integer = 0 To keys.Length - 1
                input(i).ki.dwFlags = api.KEYEVENTF_KEYUP 'zvednutí klávesy
            Next

            api.SendInput(3, input, Marshal.SizeOf(GetType(api.Input_32bitSyst))) 'odeslat zprávu o zvednutí všech kláves v poli 
        Else
            '64 bitová verze 
            Dim input As api.Input_64bitSyst() = New api.Input_64bitSyst(keys.Length - 1) {}
            'pole kódů kláves 
            For i As Integer = 0 To keys.Length - 1
                input(i).type = api.INPUT_KEYBOARD
                'jde o stisknutí 
                'o kterou klávesu se jedná 
                input(i).ki.wVk = keys(i)
            Next
            api.SendInput(3, input, Marshal.SizeOf(GetType(api.Input_64bitSyst)))
            'odešleme zprávu o stisknutí všech kláves v poli 
            For i As Integer = 0 To keys.Length - 1
                'jde o zvednutí klávesy 
                input(i).ki.dwFlags = api.KEYEVENTF_KEYUP
            Next
            'odešleme zprávu o zvednutí všech kláves v poli 
            api.SendInput(3, input, Marshal.SizeOf(GetType(api.Input_64bitSyst)))
        End If
    End Sub
End Module

A takto funkci volám:


'odeslat funkci key code klávesy, jejíž stisk se má simulovat
 KeyboardSimulation.Simulate(e.KeyCode) 'zaslání hodnoty k vypsání

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Děkuji za bleskovou odpověď :), nečekal jsem že to vůbec půjde. Doma se na to podívám.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Promiňte, ale když už někde opíšete cizí řešení, tak aspoň neříkejte, že jste to vyřešil vy.

Je to řešení z článku uvedeného níže akorát přepsané do VB.NET. Navíc mám pocit, že je dotaz zařazen v C# sekci, tak stačilo napsat odkaz na původní článek na tomto serveru.

nahlásit spamnahlásit spam -1 / 3 odpovědětodpovědět

Řešilo se to v tomto článku: http://vbnet.cz/clanek--104-globalni_odc...

V diskuzi pod ním se dospělo k tomu, že to jde i bez winapi a to pomocí třídy System.Windows.Forms.SendKeys.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Já bych se to pokusil rešit pomocí

SendKeys.Send("a"); ..atd.

Softwarově to mačká klávesy.

string s="vstupni text";

SendKeys.Send(s[0]);

SendKeys.Send(s[1]);

..............

dokumentace

http://msdn.microsoft.com/en-us/library/...

//EDIT. Tak koukám, že toto řešení je už v příspěvku výše.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback