Avatar billede flyvholm Nybegynder
08. maj 2007 - 20:13 Der er 13 kommentarer og
1 løsning

Simpelt program

Er det muligt at lave et simpelt program der hver 5 minut skaber en hændelse på computeren der gør at windows ikke går på pauseskærm..

Problemet ligger i at jeg har en IBM ThinkPad, og den har et sikkerhedssystem der gør at jeg ikke kan fravælge pauseskærmen eller gå ind og fortælle den at den først skal gå på pauseskærm efter f.eks. 2 timer... Den er sat til 10 min.. og det kan ikke ændres iflg. IBM.

Hvis det kan lade sig gøre er der så en der har lyst til at tage udfordringen op.. kunne godt tænke mig at kunne se en hel film på min bærbar uden at skulle side og pille ved den hvert 10 min..

Ved godt det er en lorte pc.. men fået den gratis fra jobbet..
Avatar billede yates Nybegynder
09. maj 2007 - 10:05 #1
Hej,

jeg tror du skal bruge APIen
keybd_event(), fx med værdien keybd_event(VK_SHIFT, 0, 0, 0)

Jeg tænker på noget i stil med:

int main(int argc, char *argv[])
{
  int u=1;
  double X;
  X=0.0;
  while (u)
  {
      X=X+0.0000000001;
      if (X>1e9)
      {
          keybd_event(VK_SHIFT, 0, 0, 0);
          X=0.0;
      }
  }
  return 0;
}

Men dette er sikkert ikke HELT optimalt idet programmet jo så tager 100% processorkraft da det hele tiden lægger sammen og lægger sammen og lægger sammen osv. Kanske det er bedre at lægge noget tilsvarende ind i et dedikeret Windowsprogram med messagepump?! Her kan nogle der kender Windows nok træde til??
Ellers skal man måske sætte processorprioriteringen ned for dette program??
Y.
Avatar billede yates Nybegynder
09. maj 2007 - 10:15 #2
Kunne sikkert gøres smartere med GetTickCount() for at tælle antal sekunder - det er en løsning der er uafhængig af processorhastigheden, tænker jeg.
Avatar billede ali.k Nybegynder
09. maj 2007 - 14:42 #3
Har ikke testet, men prøv dette:

#include <stdio.h>
#include <windows.h>

int getMillisec(int minuts)
{
    return minuts * 60 * 1000;
}

int main()
{   
    int interval = getMillisec(10);
    while (u)
    {
        keybd_event(VK_SHIFT, 0, 0, 0);
        Sleep(interval);
    }

    return 0;
}

Og ja, det kan laves smarter!;)
Avatar billede ali.k Nybegynder
09. maj 2007 - 15:14 #4
#include <stdio.h>
#include <windows.h>

int getMillisec(int minuts)
{
    return minuts * 60 * 1000;
}

int main()
{   
    int repeats;
    int interval = getMillisec(10);
    for (repeats = 20; repeats >= 0; repeats--)
    {
        keybd_event(VK_SHIFT, 0, 0, 0);
        Sleep(interval)
    }

    return 0;
}
Avatar billede flyvholm Nybegynder
10. maj 2007 - 15:15 #5
Ali.k jeg vil gerne acceptere dit svar hvis det virker.. men hvordan kan jeg få det lavet om til en *.exe fil.. har ikke en dyt forstand på C++
Avatar billede ali.k Nybegynder
10. maj 2007 - 22:22 #6
Avatar billede flyvholm Nybegynder
11. maj 2007 - 00:59 #7
Tak igen.. vil gerne lige teste om det virker din kode før jeg acceptere.. kender du nogen gode steder hvor jeg kan sætte mig ind i programmet og komme igang.. så jeg kan få lavet det om til et lille program som jeg kan sætte computeren til at køre?
Avatar billede yates Nybegynder
11. maj 2007 - 09:26 #8
OK, du installerer devC++ pakken.
Under antagelse af at dette går glat (hvis ikke, så kan jeg ikke hjælpe), starter du devC++-programmet.
Efter splash-screen osv væler du under File-menuen
"New" -> "Project"
Nu får du et vindue hvor du kan vælge type. Klik på 'console application' og sørg for at der er hakket af ved 'C project'. Tryk ok. Nu bliver du bedt om at give prjektet et navn. Det er fx flyvholm.dev. Når du har gjort det starter din kode-editor op.
Slet alt der står i kodeeditor-vinduet og paste følgende:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc, char *argv[])
{
  while (1)
  {
      sleep (60*1000);
      keybd_event(VK_SHIFT, 0, 0, 0);
  }
  return (0);
}

Nu trykker du på ctrl+F11 samtidig. Programmet kompileres. I din folder hvor DevC++-pakken gemmer sig kan du nu finde et program som hedder Flyvholm.exe og som -hvis du dobbeltklikker på det- starter op og sender et shift en gang i minuttet som OS forhåbentlig registrerer. Programmet giver dig et hjernedød sort vindue at glo på, men lad dig ikke genere af det.

Prøv det og skriv her om det virker eller ikke.
Y.
Avatar billede flyvholm Nybegynder
14. maj 2007 - 14:57 #9
Først of fremmest vil jeg lige sige tak til Yates for den udførlige forklaring.. og til Ali.k kan jeg sige at det virker.. den går ik på pauseskærm... men ik helt optimalt.. for når programmet trykker shift ned.. skal man af en eller anden grund trykke shift for den igen lader være med at skrive med store bogstaver..

Jeg havde en anden tanke.. kan man ikke trace musens x,y akser og så derefter flytte den 1 px til højre fra det den var? så man slipper for hele tiden at trykke shift ned.. det er os nok hvis det bliver gjort hvert 9 minut i stedet for hvert minut.. men det tror jeg lige jeg kan overkomme og rette selv =)

Ellers endnu engang mange tak for hjælen
Avatar billede yates Nybegynder
14. maj 2007 - 15:47 #10
Hej,

hyggeligt at kune hjælpe lidt.
Jeg tror du evt skal prøve med VK_CONTROL i stedet for VK_SHIFT.
Tror ikke du kan komme rundt om problemet igennem ved at simulere musebevægelser.

Held og lykke
Y.
Avatar billede yates Nybegynder
14. maj 2007 - 15:48 #11
Ellers prøv det her:
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);

Y.
Avatar billede flyvholm Nybegynder
14. maj 2007 - 20:32 #12
Yates endnu engang tak.. det ser ud til at virke selvom c++ kommer med følgende fejl:

9 C:\Dev-Cpp\main.c [Warning] passing arg 4 of `keybd_event' makes integer from pointer without a cast

??

Ved du evt. om det er til at få gjort så cmd winduet minimere sig i højre side af process linien?
Avatar billede yates Nybegynder
15. maj 2007 - 08:31 #13
Hej Flyvholm,

jeg tror begge problemer kan løses.
Prøv at compilere det eksempel jeg har skrevet nedenfor. Funktionen med ConsoleWindowHandle er fra http://support.microsoft.com/kb/124103, hvor du kan læse detaljer.

VH
Y.


Kode:


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

HWND GetConsoleHwnd(void)
  {
      #define MY_BUFSIZE 1024 // Buffer size for console window titles.
      HWND hwndFound;        // This is what is returned to the caller.
      char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
                                          // WindowTitle.
      char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
                                          // WindowTitle.
      GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
      wsprintf(pszNewWindowTitle,"%d/%d",
                  GetTickCount(),
                  GetCurrentProcessId());
      SetConsoleTitle(pszNewWindowTitle);
      Sleep(40);
      hwndFound=FindWindow(NULL, pszNewWindowTitle);
      SetConsoleTitle(pszOldWindowTitle);
      return(hwndFound);
}
 
 
int main(int argc, char *argv[])
{
  ShowWindow( GetConsoleHwnd(), SW_MINIMIZE );
  while (1)
  {
      sleep (60*1000);
      keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  }
  return (0);
}
Avatar billede flyvholm Nybegynder
17. maj 2007 - 11:36 #14
Hey Yates

Tror du misforstod mig.. jeg mente system tray icon.. har oprettet et nyt spørgsmål så er er points at hente igen.. da dette spørgsmål er besvaret =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester