Gå til innhold

Anbefalte innlegg

Hei!

 

La dette først inn i C++ gruppa, da jeg jobbet med C++ og ikke C#, mange som kommer med hva kan man si wannabe innspill uten å egentlig kunne noen ting, så håper dere kan hjelpe her!

 

Slik gitt deler av scriptet i C++

private: System::Void Form1_KeyDown(System::Object^  sender, system::Windows::Forms::KeyEventArgs^  e) {
                                if ( e->KeyCode == Keys::Enter) {
                                       lblMessage->Text = "key changed";


                                }

 

Det vil si at når jeg klikket på Enter-tasten ble lblMessage satt til "Key changed", det jeg ønsker her er også at når enter blir klikket skal den endre values i Windows Registry, dette må være kompatibelt i både x86 og x64.

 

"HKEY_LOCAL_MACHINE\SOFTWARE\My Prog\Node" DWORDen heter "Mode" og har value 0.

 

Steg 1 i programmet; når Enter klikkes skal denne DWORDen endres til value 1. Noen som faktisk vet hvordan man gjør dette og ikke bare kommer med merkelige innspill som rett og slett er irrelevant så hadde det vært kjempe flott, setter pris på god hjelp.

Lenke til kommentar
Videoannonse
Annonse

En av disse bør dekke behovet. Du får sjekke forskjell på 32 og 64 bit med tanke på at Registry er litt knotete etter hva mode du leser den på (32 vs 64bit).

 

using namespace Microsoft::Win32;


Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
Registry::LocalMachine->OpenBaseKey(RegistryHive::LocalMachine, RegistryView::Registry64)->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
Registry::LocalMachine->OpenBaseKey(RegistryHive::LocalMachine, RegistryView::Registry32)->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);

 

Trenger du å opprette en sti i registry benytter du dette:

 

Registry::LocalMachine->CreateSubKey("SOFTWARE\\My Prog\\Node");

 

Du ser fort logikken der. Ta en titt her for generell lærdom på C++/CLI og registry: http://msdn.microsoft.com/en-us/library/df4afx57.aspx

Endret av wolf5
Lenke til kommentar

Du ser fort logikken der. Ta en titt her for generell lærdom på C++/CLI og registry: http://msdn.microsoft.com/en-us/library/df4afx57.aspx

Det han refererer til i posten er at jeg bare postet en lenke til MSDN siden om Registry klassen som har helt kurrante eksempler for både C# og C++/CLI. Det TS derimot var interessert i, var at en eller annen person på forumet skulle skrive et program for han som gjør et eller annet registry greier. Han er overhode ikke interessert i å lære seg hverken C++/CLI eller C#.

 

Å lære seg hvordan registry klassene fungerer er ikke "et prosjekt" dersom han har noen som helst form for erfaring eller kunnskap om programmering. Da er det bare å kikke i dokumentasjonen. Det krever kun helt grunnleggende forståelse for begge språkene, noe TS åpenbart mangler.

Endret av GeirGrusom
Lenke til kommentar

Noen lærer vel bedre av helt konkrete eksempler på akkurat det de er på jakt etter vil jeg tro. Dvs at de er på et veldig tidlig stadium av læringen hvor de fremdeles sliter med å forstå det grunnleggende. Da er det ofte greit med helt konkrete nøyaktige eksempler. (?)

Lenke til kommentar

Hei Wolf5.

 

Stemmer det, jeg er litt lei av å høre at dette heller burde gjøres slik og slik, eller at det heller kan være smart å lære slik og slik. Det er rett og slett ikke hva jeg spurte etter :) Jeg klarer fint til å selv google meg frem til application exempler hvor dette gjøres i main(), men nå skal jeg faktisk ha dette under en statement, evt om programmet kunen fått kjørt en bat fil under statement, men dette kan ingen svare meg på. Gir meg rett og slett vås rett fra google.

Lenke til kommentar

private: System::Void Form1_KeyDown(System::Object^  sender, system::Windows::Forms::KeyEventArgs^  e) {
                                if ( e->KeyCode == Keys::Enter) {
                                       lblMessage->Text = "key changed";
                                       Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
                                }

 

For å starte en batfil vil jeg tippe følgende (har ikke vs tilgjengelig her) (using namespace System::Diagnostics):

private: System::Void Form1_KeyDown(System::Object^  sender, system::Windows::Forms::KeyEventArgs^  e) {
                                if ( e->KeyCode == Keys::Enter) {
                                       lblMessage->Text = "key changed";
                                       Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
                                       Process->Start("minbatfil.bat");
                                }

Lenke til kommentar

Hei Wolf5.

 

Stemmer det, jeg er litt lei av å høre at dette heller burde gjøres slik og slik, eller at det heller kan være smart å lære slik og slik. Det er rett og slett ikke hva jeg spurte etter :) Jeg klarer fint til å selv google meg frem til application exempler hvor dette gjøres i main(), men nå skal jeg faktisk ha dette under en statement, evt om programmet kunen fått kjørt en bat fil under statement, men dette kan ingen svare meg på. Gir meg rett og slett vås rett fra google.

Fordi det er ikke det du spurte om. Du fikk svar på spørsmålene dine, men det endte bare med at du ville ha noen som skrev det for deg.

Lenke til kommentar

Takk for god hjelp wolf, du vet ikke også hvordan jeg kan sjekke nåværende value?

 

Tenkte f.eks.

 

Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->GetValue("Mode");

 

også if value == 0

Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);

Lenke til kommentar
Gjest Slettet-Pqy3rC

Noen lærer vel bedre av helt konkrete eksempler på akkurat det de er på jakt etter vil jeg tro. Dvs at de er på et veldig tidlig stadium av læringen hvor de fremdeles sliter med å forstå det grunnleggende. Da er det ofte greit med helt konkrete nøyaktige eksempler. (?)

Mmmm.. særlig et helt spesifikt eksempel. Hvilket er å endre en verdi i win registry når du trykker en tast. Det er forøvrig ikke viktig hvilket språk som benyttes, bare noen viser ham koden til dette ene eksempelet...

Endret av Slettet-Pqy3rC
Lenke til kommentar

Eksempler brukt i saken her går langt utenfor hva totalen av programmet gjør. Men er veldig fint å få spesifikke eksempler på hvordan ting gjøres slik at jeg kan ta dette inn i mitt program og gjøre det på min måte. Så Ja, jeg syns det er veldig flott og det tror jeg de aller fleste gjør.

 

Hva er 512 * 5163?

Du kan lese på matematikk.net er ikke akkurat svaret folk er ute etter, men om noen setter det opp riktig og viser hvordan det er gjort i praksis så forstår folk fort litt mer. Tror det gjelder de aller fleste. Også har vi selvfølgelig de som skal forklare en bedre måte dersom du ikke kan noe; jaja du kan jo starte med å ta 512 + 512 + 512 + 512... Nei, enkleste er ofte det beste, takk så mye Wolf :)

Endret av TobiasG
Lenke til kommentar

Gidder ikke krangle mer med deg (til tross for at det du skriver ikke samsvarer med hverandre, ref. Tiltman sitt innlegg)

 

For å sjekke om en registry nøkkel endres, kan en benytte to løsninger: Windows Management Instrumentation, eller den noe enklere i bruk, RegNotifyChangeKeyValue funksjonen:

 

 

Komplett fungerende eksempel i C# som stopper helt til en legger til eller fjerner en nøkkel i HKEY_CURRENT_USER\Software\Microsoft:

using System;
using System.Runtime.InteropServices;
using System.Threading;

using Microsoft.Win32;
using Microsoft.Win32.SafeHandles;

namespace RegNotifyTest
{
   public class Program
   {
       [Flags]
       public enum RegKeyNotifyFilter
       {
           ChangeName = 0x1, // Notify the caller if a subkey is added or deleted.
           ChangeAttributes = 0x2, // Notify the caller of changes to the attributes of the key, such as the security descriptor information.
           ChangeLastSet = 0x4, // Notify the caller of changes to a value of the key. This can include adding or deleting a value, or changing an existing value.
           ChangeSecurity = 0x8 // Notify the caller of changes to the security descriptor of the key.
       }

       [DllImport("Advapi32")]
       public static extern int RegNotifyChangeKeyValue(SafeRegistryHandle key, bool watchSubTree, RegKeyNotifyFilter notifyFilter, SafeWaitHandle event_handle, bool async);

       public static int RegNotifyChangeKeyValue(
           RegistryKey key, bool watchSubTree, RegKeyNotifyFilter notifyFilter, WaitHandle @event, bool async)
       {
           return RegNotifyChangeKeyValue(key.Handle, watchSubTree, notifyFilter, @event.SafeWaitHandle, async);
       }

       static void Main()
       {
           AutoResetEvent e = new AutoResetEvent(false);

           var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft");

           RegNotifyChangeKeyValue(key, false, RegKeyNotifyFilter.ChangeName, e, true);

           e.WaitOne();

           System.Diagnostics.Debugger.Break();
       }
   }
}

edit: laget en overload som gjør funksjonen litt enklere i bruk.

Endret av GeirGrusom
Lenke til kommentar

Flott om du leser dette igjen. Dette skal gjøres under

private: System::Void Form1_KeyDown(System::Object^  sender, system::Windows::Forms::KeyEventArgs^  e) {
                                if ( e->KeyCode == Keys::Enter) {
                                       lblMessage->Text = "key changed";
                                       Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
                                }

 

og ikke under main(), men takk for forsøk.

Lenke til kommentar

Flott om du leser dette igjen. Dette skal gjøres under

private: System::Void Form1_KeyDown(System::Object^  sender, system::Windows::Forms::KeyEventArgs^  e) {
                                if ( e->KeyCode == Keys::Enter) {
                                       lblMessage->Text = "key changed";
                                       Registry::LocalMachine->OpenSubKey("SOFTWARE\\My Prog\\Node", true)->SetValue("Mode",1);
                                }

 

og ikke under main(), men takk for forsøk.

Jeg la ned tiden min for å vise deg hvordan du kan gjøre en ting du lurte på som blir avfeid fordi jeg ikke skrev det inn i programmet ditt?

Det er dessverre ikke noen emoticon for å vise deg fingeren, men hvis du kan gå og leke på motorveien hadde det vært fint.

  • Liker 4
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...