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.
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 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>
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'
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.