Gå til innhold

Anbefalte innlegg

Skrevet

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.

Videoannonse
Annonse
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet

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. (?)

Skrevet

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.

Skrevet

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");
                                }

Skrevet

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.

Skrevet

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);

Gjest Slettet-Pqy3rC
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet

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.

Skrevet

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

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å
×
×
  • Opprett ny...