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 subJa 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.
Siis mikä tässä on ongelmana, miten se ei "tahtonut osua"? Ja textboxin sijastahan voi käyttää vaikka comboboxia.
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ä ;)
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).
Tuosta tai vastaavasta voi olla hyötyä ideointiin.
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 ClassFormSettings.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 Classapp.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>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 SubKohta "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'
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.