[c#] hotkey vraag

Pagina: 1
Acties:

  • ungarmax
  • Registratie: December 2001
  • Laatst online: 29-06-2021
Ik ben opzoek naar een manier om 2 hotkeys te gebruiken.
1 hotkey werkt momenteel al. Nu wil ik een tweede registreren en daar een methode aan koppelen.
Ik begrijp echter niet hoe de identificatie van de hotkey werkt. Het lijkt er op imho dat als je welke hotkey dan ook registreert, ja altijd in WndProc komt.
oftwel, kan iemand mij verder helpen?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Benodigd voor het aanmaken van een hotkey
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
        
//Zodra het programma gestart wordt moeten de hotkeys actief worden.
protected override void OnLoad(EventArgs e)
{
    RegisterHotKey(this.Handle, 0,0,0x77);     //0x77 = virtual key adress for F8
    //RegisterHotKey(this.Handle, 0,0,0x78);   //0x78 = virtual key adress for F9
}
       
//Vang de juiste keytoetsen op voordat ze uitgevoerd worden en voer dan eerst de eigen code uit???
protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x0312)
    {
        //stop de timer als die nog aan stond
        timer1.Stop();
        //maak i gelijk aan nul zodat de timer weer opnieuw kan beginnen te tellen
        i = 0;
        //start nu opnieuw de timerprocedure
        timer1.Start();
    }
     else
        base.WndProc(ref m);
}


Momenteel werkt dit dus prima de F8 toets voert de functies uit.
Nu wil ik echter een tweede hotkey invoeren (F9) en die moet een andere methode starten.
Hoe doe ik dat? Heeft dat iets te maken met 0x0312? ik kan namelijk nergens vinden wat de betekenis daarvan is. Het lijkt er echter op dat dat niet de identificatie is van de hotkey.
P.S. ook begrijp ik niet echt wat het volgende doet..
C#:
1
base.WndProc(ref m)

[ Voor 10% gewijzigd door ungarmax op 28-07-2005 13:51 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:47

Creepy

Tactical Espionage Splatterer

Zie: http://msdn.microsoft.com...putmessages/wm_hotkey.asp

De lparam bevat het ID van de hotkey, welke je met RegisterHotKey zet. Jij zet beide nu op 0, dus kan je geen verschil zien. Je checkt nu alleen of je een WM_HOTKEY message ontvangt, en nog niet wat daar in zit.

Je bent nu zelf de messagequeue aan het uitlezen. Indien je niks met een message doet zul je de message door moeten geven. Dat doe je in dit geval met de base.WndProc()

Overigens is hierop MSDN ladingen documentatie over te vinden ;)

[ Voor 24% gewijzigd door Creepy op 27-07-2005 09:21 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • ungarmax
  • Registratie: December 2001
  • Laatst online: 29-06-2021
aha, hartstikke duidelijk. bedankt!
Creepy schreef op woensdag 27 juli 2005 @ 09:20:
Je bent nu zelf de messagequeue aan het uitlezen. Indien je niks met een message doet zul je de message door moeten geven. Dat doe je in dit geval met de base.WndProc()
thx!

[ Voor 12% gewijzigd door ungarmax op 27-07-2005 09:27 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:47

Creepy

Tactical Espionage Splatterer

Overigens is er in C# ook wel ergens een constante te vinden die 0x0312 bevat. (WM_HOTKEY o.i.d. ;) ) Dat maakt het meteen een stuk duidelijker welke message je nu afvangt ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Creepy schreef op woensdag 27 juli 2005 @ 09:29:
Overigens is er in C# ook wel ergens een constante te vinden die 0x0312 bevat. (WM_HOTKEY o.i.d. ;) ) Dat maakt het meteen een stuk duidelijker welke message je nu afvangt ;)
Nope, System.dll bevat wel een aantal WM_ constanten (in Microsoft.Win32.NativeMethods), maar WM_HOTKEY zit daar niet bij.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • ungarmax
  • Registratie: December 2001
  • Laatst online: 29-06-2021
Na de hele ochtend bezig te zijn geweest kom ik er helaas nog steeds niet uit. 8)7
Ik heb atom1 en atom 2 "globaal" gedefinieerd als int.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//Zodra het programma gestart wordt moeten de hotkeys actief worden.
protected override void OnLoad(EventArgs e)
{
    atom1 = GlobalAddAtom("100");
    atom2 = GlobalAddAtom("200");
    RegisterHotKey(this.Handle, atom1,0,0x77);//0x77 = virtual key adress for F8,atom1=keyid
    RegisterHotKey(this.Handle, atom2,0,0x78);//0x78 = virtual key adress for F9,atom2=keyid
}
        
//zodra het programma wordt afgesloten moeten de geregistreerde hotkeys ook weer verwijderd worden.

private void Timer_FormClosed(object sender, FormClosedEventArgs e)
{
    UnregisterHotKey(this.Handle, atom1);
    UnregisterHotKey(this.Handle, atom2);
    GlobalDeleteAtom(atom1);
    GlobalDeleteAtom(atom2);
}
        

//Vang de juiste keytoetsen op voordat ze uitgevoerd worden en voor dan eerst de eigen code uit ???
protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x0312)
    {
        if ( ???)   //wat moet hier staan zodat ik kan controleren op key.
        {   
            /**MessageBox.Show("timer gestart");*/
            //stop de timer als die nog aan stond
            timer1.Stop();
            //maak i gelijk aan nul zodat de timer weer opnieuw kan beginnen te tellen
            i = 0;
            //start nu opnieuw de timerprocedure
            timer1.Start();
        }
        if ( m.Msg == atom2) (???)
        {
            timer1.Stop();
            i = 0;
        }
    }
    else
    base.WndProc(ref m);
}


ik heb begrepen dat je voor de keyidentifier gebruik moet maken van addatom; of dit echter de juiste manier is, betwijfel ik maar goed, wat ik me dus afvraag is
1.) hoe moet ik controleren op keyid zodat ik weet welke hotkey (F8 of F9) is ingedrukt.

wat betreft de LParam. Ik heb geprobeerd om iets als m.Lparam == atom1 maar dat werkt ook niet omdat de dataypen niet hetzelfde zijn.

[ Voor 17% gewijzigd door ungarmax op 28-07-2005 13:51 ]


  • ungarmax
  • Registratie: December 2001
  • Laatst online: 29-06-2021
Heeft iemand een idee hoe ik gebruik kan maken van de hotkey property "int id"?
ik probeer nu om de key-id waarde te controleren zodat ik onderscheid kan maken tussen de F8 en F9 maar ik heb geen idee hoe.
Ik heb de bovenstaande post veranderd met wat ik als laatste heb geprobeerd (wat ook niet werkte)
8)7

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:47

Creepy

Tactical Espionage Splatterer

In de C en C++ api wordt voor het ID gewoon een int gebruikt. Het ID kan je per key gewoon zelf bepalen met registerhotkey. Dat ID krijg je in je message weer terug.
Als je in de MSDN nou zelf eens zou kijken wat LPARAM voor type is dan had je gezien dat dat een IntPtr (i.t.t. een Int). Een IntPtr heeft een ToInt32 method en een ToInt64 method. Raad eens wat die doen...

Je bent er bijna :) Maar de dingen die je vraagt zijn denk ik best wel zelf te vinden als je de betreffende classes en types even opzoekt in de MSDN ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Wat ik van MSDN begrijp is dat je alleen wat met GlobalAddAtom hoeft te doen als je shared DLL hebt.
Anders kan je gewoon zélf een ID verzinnen, in de range van 0x0000 tot 0xBFFF. Je kan dus onderscheidt maken tussen F8 en F9 door de eerste als id 0 mee te geven en de tweede 1. En het werkt, want ik heb het zelf ook net geïmplementeerd :)

^^ Wat Creepy dus ook zegt. Je kan, als je het makkelijker vindt, een IntPtr ook gewoon casten naar een int:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x0312) //WM_HOTKEY 
    {
        if ((int) m.WParam == 0)
            DoSomethingWithF8();
        else if ((int) m.WParam == 1)
            DoSometingWithF9();
    }
    else
    {
        base.WndProc(ref m);
    }
}

[ Voor 29% gewijzigd door riezebosch op 28-07-2005 13:36 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1