Konvertování C# -> VB.NET   zodpovězená otázka

C#, VB.NET

Prosím o radu jak přepsat následující řádek kódu z C# do VB.NET

Ve článku http://www.vbnet.cz/clanek--104-globalni... je krásna aplikace. Z celé třídy odchytávání kláves jsem zdovolením udělal dll knihovnu, kterou jsem referencoval do svojí aplikace ve VB.NET, ale zaboha se mi nedaří konverovat kód pro použití.

    class Program
    {
        static void Main()
        {
            KeyboardHook hook = new KeyboardHook(); //vytvoříme instanci naší třídy
            hook.KeyPressed += new KeyboardHook.HookHandler(hook_KeyPressed); //inicializujeme událost po stisknutí tlačítk
            System.Windows.Forms.Application.Run(); //spustíme program
        }

        static void hook_KeyPressed(int key)
        {
            Console.WriteLine(key);
        }
    }

Měl jsem zato, že vytvořim instanci hooku a ta bude mít událost stisknutí klávesy a pomocí argumentu z ní vyčtu číslo klávesy. Ale ač to tak udělám, tak mi to stále že potřebuje definovat proměnou do který nejspíš má uložit to číslo.

Inspiroval jsem se například u máčkání myšítka

    Private Sub NotifyIcon1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
        If e.Button = Windows.Forms.MouseButtons.Left Then
            ...
            ...
        End If
    End Sub

A vytvořil jsem

    Private klavesa As ChytacKlaves.HookHandler

    Private Sub ChytKlavesu(ByVal sender As System.Object, ByVal a As Integer) Handles klavesa.KeyPressed
        ListBox1.Items.Add(a)
    End Sub

Ale asi sem tak velkej začátečník že asi sem spojil jabka s hruškama.

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

Já C# neznám vůbec a VB.NET málo. Když něco potřebuji konvertovat, jdu sem:

http://www.developerfusion.com/tools/con...

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

Neuvěřitelné, ono to funguje, dokonalé.

výsledek:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim hook As New ChytacKlaves.ChytacKlaves()
        AddHandler (hook.KeyPressed), AddressOf hook_KeyPressed
    End Sub
    Private Sub hook_KeyPressed(ByVal key As Integer)
        ListBox1.Items.Add(key)
    End Sub

Na druhou stranu to dělá to samé, stejně tak jak končí diskuze u článku (při delším (dlouhém) stiknutí klávesy (několika kláves za sebou))... http://img148.imageshack.us/i/callbackon...

Takže je celý program vlastně nepoužitelný ....

Apeloval bych na tvůrce článku, jestli by to nemohl zkouknout a zkontrolovat kde je chyba? Popřípadě pokud by vznikl nový článek na téma Globální odchytávání kláves, tak jestli by ukázkový kód mohl být i ve VB.NET, i když ten konvertor zázračně funguje :-)

Díky

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

Váš problém je asi v tom, že ten hook deklarujete uvnitř metody (Form1_Load) a ne globálně v rámci třídy. Životní cyklus proměnné deklarované v rámci metody (pokud není označena jako Static) končí návratem z metody (skončením metody), potom se na tu instanci vrhne garbage collector (zde přeložený jako úklidový modul) a odstraní ji z paměti (protože už na ní není žádná reference). Nadeklarujte ten hook globálně v rámci třídy Form1 a zkuste jestli to pomůže.

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

Dobrá tedy vyhodil jsem to ven:

Public Class Form1
    Dim hook As New ChytacKlaves.ChytacKlaves()
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler (hook.KeyPressed), AddressOf hook_KeyPressed
    End Sub
    Private Sub hook_KeyPressed(ByVal key As Integer)
        ListBox1.Items.Add(key)
        Label1.Text = (Convert.ToInt64(Label1.Text) + 1).ToString
    End Sub
End Class

Ale dělá to stejně :-(

Hodil jsem si tam label do kterýho dávám počet chycených kláves a někdy to vyhodí chybu u 80-té, někdy až třeba 500-té chycené. Myslím že jsem postřehl že když zakomentuju ukládání do listboxu a labelu, doba po které se chyba ukáže se rapidně prodlouží, ale stejně nastane i když s proměnou nic nedělám.

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

Tak jsem ještě zkoušel a je to naprosto nepravidelné. Aplikaci jsem si spustil z exáče, takže visualstudio do toho nemohlo kecat. Do popisku aplikace jsem si dal pocitani chycenych klaves a program nechal bezet a pracoval na pocitaci. I pri beznem psani alikace po radove 500 chycenych klavesach bezduvodne, a bez nahlaseni nejake chyby spadla a ukoncila se.

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