Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Pikanäppäinten rekisteröiminen

Sivun loppuun

Keltanokka [08.12.2011 22:33:48]

#

Morjens :)

Olen tähän mennessä rekisteröinyt pikanäppäimiä tähän tyyliin:

 Public Const WM_HOTKEY As Integer = &H312

<DllImport("User32.dll")> _
Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr, _
                        ByVal id As Integer, ByVal fsModifiers As Integer, _
                        ByVal vk As Integer) As Integer
End Function

Private Sub Form1_Load(ByVal sender As System.Object, _
                    ByVal e As System.EventArgs) Handles MyBase.Load
    RegisterHotKey(Me.Handle, 100, 0, Keys.A)
end sub

Ja samalla tyylillä myös unregister. Mutta nyt olisi tarkoitus tehdä vähän mukautettavampi versio, jossa käyttäjä saa itse määrittää pikanäppäimet (4 kipaletta). Mikähän tähän olisi paras keino? :) Koitin sählätä tuohon ylläolevaan ja textboxien avulla, muttei tahtonut osua. (textbox on kyllä todella huono siihen, mutta ainahan voi yrittää^^). Ja selvennyksenä, että se pitää myös rekisteröidä, formi ei tule olemaan aina päällimäisenä.

Kaikki neuvot ja vinkit ovat tervetulleita.

RQ [09.12.2011 01:29:24]

#

Siis mikä tässä on ongelmana, miten se ei "tahtonut osua"? Ja textboxin sijastahan voi käyttää vaikka comboboxia.

Keltanokka [09.12.2011 14:31:48]

#

Siis ongelmana on se, etten tiedä miten tämä pitäisi tehdä. En siis ole paljoa pikanäppäinten kanssa värkännnyt ja tuonkin olen suoraan netistä ottanut. Nyt tarkoituksena ei ole luoda ohjelmaan valmiita pikanäppäimiä, vaan valikko, josta käyttäjä saa itse määrittää pikanäppäimet.

Eli käytännössä 4 comboboxia(?), joihin saa valita näppäimen. Alapuolella button, josta painamalla ohjelma rekisteröi compoboxeissa olevat näppäimet.

Eli jos joku jaksaisi, niin todella hyvä esimerkki tästä voisi olla vaikkapa tälläinen mallikoodi:
- button1.click = registerhotkey1
- hotkey1 = combobox.tag (/text/? :D) 'eipä ole tullut näitäkään käytettyä ;)

jimi-kimi [09.12.2011 21:17:01]

#

http://www.youtube.com/watch?v=iYsIEAshBMQ
Loput voitkin sitten keksiä itse.

EDIT:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646300(v=VS.85).aspx
Tuosta tai vastaavasta voi olla hyötyä ideointiin.

neau33 [11.12.2011 09:15:37]

#

No Morjens Keltanokka!

tässä sulle HotKey-viritelmä, joka myös säilyttää asetuksensa...

Luo uusi SharpDevelop - VB.NET WinFroms-projekti (HotKeySettings), lisää projektiin uusi lomake (FormSettings.vb) sekä app.config file ja lisää projektiin myös GAC referenssi: System.Configuration

MainForm.vb:

'(Huom! väännetty SharpDevelop 4.0:lla/.NET Framework 4.0:lla)

'Lomakkeele:
'1 MenuStrip kontrolli (menuStrip1)
' asetuksetToolStripMenuItem
'  pikavalinnatToolStripMenuItem

Imports System.Windows.Forms
Imports System.Configuration

Public Partial Class MainForm

   Public Shared HotKey(3) As String

   Private config As Configuration = _
   ConfigurationManager.OpenExeConfiguration( _
   ConfigurationUserLevel.None)

   Public Sub New()
      Me.InitializeComponent()
   End Sub

   Sub MainForm_Load(sender As Object, e As EventArgs)

      For i = 0 To HotKey.Length - 1
         HotKey(i) = config.AppSettings.Settings.Item( _
         "HotKey" + CStr(i + 1)).Value
      Next

      Me.KeyPreview = True

   End Sub

   Sub MainForm_KeyUp(sender As Object, e As KeyEventArgs)

      For i = 0 To HotKey.Length - 1

         If e.KeyData.ToString = HotKey(i) Then

            'testi
            MsgBox("Pikavalinta " + CStr(i + 1) + " = " + HotKey(i))

            Select Case i
               Case 0
                  'tee jotain...
               Case 1
                  'tee jotain muuta...
               Case 2
                  'tee jotain muuta...
               Case 3
                  'tee jotain muuta...
            End Select

            Exit For

         End If
      Next
   End Sub

   Sub PikavalinnatToolStripMenuItem_Click(sender As Object, e As EventArgs)

      Dim frm As New FormSettings
      frm.ShowDialog : frm = Nothing

   End Sub

   Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs)

      For i = 0 To HotKey.Length - 1
         config.AppSettings.Settings.Item( _
         "HotKey" + CStr(i + 1)).Value = HotKey(i)
      Next

      config.Save(ConfigurationSaveMode.Modified)
      '(VB Express ei tallenna asetuksia debug tilassa)
      config = Nothing: HotKey = Nothing

   End Sub

End Class

FormSettings.vb:

'Lomakkeelle:
'2 Button kontrollia  (button1 & button2)
'4 TexBox kontrollia  (textBox1 - textBox4)
'1 ComboBox kontrolli (comboBox1)

Imports System.Windows.Forms

Public Partial Class FormSettings

   Public Sub New()

      Me.InitializeComponent()

   End Sub

   Sub FormSettings_Load(sender As Object, e As EventArgs)

      Me.Text = "Asetukset - Pikanäppäimet"
      Me.FormBorderStyle = FormBorderStyle.FixedToolWindow
      Me.ControlBox = False
      comboBox1.DropDownStyle = ComboBoxStyle.DropDownList
      comboBox1.TabStop = False

      comboBox1.Items.AddRange(New Object(){"", _
      Keys.A, Keys.B, Keys.C, Keys.D, Keys.E, _
      Keys.F, Keys.G, Keys.H, Keys.I, Keys.J, _
      Keys.K, Keys.L, Keys.M, Keys.N, Keys.O, _
      Keys.P, Keys.Q, Keys.R, Keys.S, Keys.T, _
      Keys.U, Keys.V, Keys.W, Keys.X, Keys.Y, Keys.Z, _
      Keys.F1,Keys.F2, Keys.F3, Keys.F4, Keys.F5, Keys.F6, _
      Keys.F7, Keys.F8, Keys.F9, Keys.F10, Keys.F11, Keys.F12}) 'esim.

      For i As Integer = 0 To MainForm.HotKey.Length - 1
         Dim txtBox As TextBox = _
         CType(Me.Controls("textBox" + CStr(i + 1)),TextBox)
         txtBox.ReadOnly = True
         txtBox.Text = MainForm.HotKey(i)
         txtBox = Nothing
      Next

      button1.Text = "OK"
      button2.Text = "Cancel"
      comboBox1.Visible = False
      button2.Focus

   End Sub

   Sub TextBox1_Enter(sender As Object, e As EventArgs)
      SetComboBox(CType(sender, TextBox))
   End Sub

   Sub TextBox2_Enter(sender As Object, e As EventArgs)
      SetComboBox(CType(sender, TextBox))
   End Sub

   Sub TextBox3_Enter(sender As Object, e As EventArgs)
      SetComboBox(CType(sender, TextBox))
   End Sub

   Sub TextBox4_Enter(sender As Object, e As EventArgs)
      SetComboBox(CType(sender, TextBox))
   End Sub

   Sub SetComboBox(txtBox As TextBox)

      comboBox1.Left = txtBox.Left
      comboBox1.Width = txtBox.Width
      comboBox1.Top = txtBox.Top + txtBox.Height
      comboBox1.Visible = True
      comboBox1.SelectedIndex = 0

      For i As Integer = 0 To comboBox1.Items.Count  - 1
         If comboBox1.Items(i).ToString = txtBox.Text Then
            comboBox1.SelectedIndex = i: Exit For
         End If
      Next

   End Sub

   Sub Button1_Click(sender As Object, e As EventArgs)

      For i As Integer = 0 To MainForm.HotKey.Length - 1
         MainForm.HotKey(i) = Me.Controls( _
         "textBox" + CStr(i + 1)).Text
      Next

      Me.Close

   End Sub

   Sub Button2_Click(sender As Object, e As EventArgs)
      Me.Close
   End Sub

   Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs)

      Dim txtBox As TextBox, tmpBox As TextBox
      Static tagIndex As Integer

      For i As Integer = 1 To 4
         txtBox = CType(Me.Controls("textBox" + CStr(i)), TextBox)
         If txtBox.Left = comboBox1.Left Then
            For j As Integer = 1 To 4
               tmpBox = CType(Me.Controls("textBox" + CStr(j)), TextBox)
               If tmpBox.Text = ComboBox1.SelectedItem.ToString _
               And tmpBox.Text <> String.Empty And j <> i Then
                  MsgBox("Pikavalinta '" + tmpBox.Text + "' on jo valittu")
                  comboBox1.SelectedIndex = tagIndex
                  txtBox = Nothing: tmpBox = Nothing: Exit Sub
               End If
            Next j
            txtBox.Text = ComboBox1.SelectedItem.ToString
            Exit For
         End If
      Next i

      tagIndex = comboBox1.SelectedIndex
      txtBox = Nothing: tmpBox = Nothing

   End Sub

   Sub Button1_Enter(sender As Object, e As EventArgs)
      comboBox1.Visible = False
   End Sub

   Sub Button2_Enter(sender As Object, e As EventArgs)
      comboBox1.Visible = False
   End Sub

End Class

app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
   </startup>
   <appSettings>
      <add key="HotKey1" value="" />
      <add key="HotKey2" value="" />
      <add key="HotKey3" value="" />
      <add key="HotKey4" value="" />
    </appSettings>
</configuration>

Keltanokka [11.12.2011 14:09:50]

#

Kiitos Nea koodistasi, mutta pari kohtaa siitä... :)

Oikeastaan kaikki "handlesit" puuttuu, ne varmaankin pitää lisätä. No lisäsin ne ja pari ongelmaa ilmesty:

Sub MainForm_Load(sender As Object, e As EventArgs) Hadles MyBase.load

      For i = 0 To HotKey.Length - 1
         HotKey(i) = config.AppSettings.Settings.Item( _
         "HotKey" + CStr(i + 1)).Value
      Next

      Me.KeyPreview = True

   End Sub

Kohta "Hotkey(i)....Value" menee keltaseksi eikä koko ikkuna aukea. Sama homma formin sulkemisessa, form closing ei siis toimi. No huvikseen koitin ilman koko koodia ja ikkuna aukesi hyvin ja päästäänkin seuraavaan ongelmaan.

Formsetting:ssä pikkunen probleema johon en itse keksinyt syytä. Elikkäs kun klikkaa textboxia niin siihen avautuu combobox aivan oikein. Saa valittua hyvin numeron ja se jää siihen aivan kuten pitääkin. Mutta sitten kun klikkaat seuraavaa (aivan sama mitä) textboxia, niin edellinen (textbox1) menee taas tyhjäksi. Myös esimerkiksi, jos valitsee textbox2:een (tai 3/4:een) numeron, niin se näkyy textbox1:sessä. =ei voi valita kuin yhden pikavalinnan.

Ja sitten vielä viimenen. Vissiinkin näyttää puuttuvan pikavalinnan rekisteröinti. En ehtinyt sitä nyt koittaa ja ajattelin, että ensin parempi selvittää nuo yläpuolella olevat jutut.
Nyt siis saa sen yhden pikavalinnan asetettua ja se toimii silloin, kun mainform on päällinmäisenä. Mutta sen pitäisi toimia aina :) Tämä on varmaankin helpoin ratkaista näistä ongelmista.

Kiitokset vielä Nealle koodista, mutta vielä vähän tarvisin apua :)


Ja vielä pikku lisäys. Iskin tuon app.config.file -koodin siihen valmiin pätkän loppuun ja poistin sitä ennen olleen "</configuration>" osan. menikö oikein? Ainakaan suoraan ei erroria antanut, mutta 3 viestiä tuli:
Message 1:Could not find schema information for the element 'supportedRuntime'.
Message 2: sama kuin yllä paitsi 'version'
Message 3: sama kuin yllä paitsi 'sku'

neau33 [11.12.2011 15:09:15]

#

Moi taas Keltanokka!

Ilmoitin kyllä selvästi esimerkkini MainForm koodin alussa, että (... väännetty SharpDevelop 4.0:lla ...). Elikäs SharpDevelop generoi automaattisesti kunkin lomakkeen ohjausobjektien ominaisuudet ja tapahtumien handlerit erilliseen .designer tiedostoon hieman Microsoft Visual Basic IDE:n tyylistä poiketen, joten esimerkin koodi ei toimi suoraan copy/paste periaatteella esim. Microsoft Visual Basic 2010 ympäristössä.

Omasta puolestani suosin SharpDevelop ympäristöä syystä, että voin puukotella sitä vapaasti mieleni mukaisiin toimintoihin, jotka jäävät Visual Basic Express edition vääntäjiltä haaveeksi.

Halutessaan täältä voi impata valmiin Visual Basic 2010 Express projektin.

Keltanokka [11.12.2011 15:35:38]

#

Täytyy kyllä myöntää, ettei ollut mitään hajua mikä tämä SharpDevelop on enkä sitä alkanut siinä kaivamaan. Mutta nyt toimii, tuon latasin ja muutin omaan käyttöön sopivaksi.
Kiitos.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta