Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8
1

Глобальная статистика

18.12.2012, 13:46. Показов 1362. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста решить задачу
Необходимо обеспечить запись в один файл статистики клавиатурных сообщений приходящих вашему окну. Учтите тот факт, что приложение может быть запущено много раз и все равно запись информации должна осуществляться в один файл
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2012, 13:46
Ответы с готовыми решениями:

Глобальная блокировка файлов
Добрый день! Пытаюсь на Delphi XE2 автоматизировать анализ внутренних рабочих отчетов. В...

Проблема с TreeView (глобальная).
Дело вот в чём : Функция TreeView1.Items.Add(Node: TTreeNode,const S:string): TTreeNode ...

Записи глобальная переменная шалит
Вот скрин, не понимаю, в чём ошибка! Если засунуть строку с ошибкой в локальные вары, то все супер,...

Статистика в Делфи
Как ведётся статистика общего количества документов и страниц, распечатанных через программу.

2
0 / 0 / 1
Регистрация: 18.12.2012
Сообщений: 8
19.12.2012, 22:03  [ТС] 2
Лучший ответ Сообщение было отмечено Marinast как решение

Решение

помогите исправить код

Delphi
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
program Project4;
 
uses
  Windows,
  Messages,
  SysUtils;
 
var
  WndClass: TWndClass;
  szAppName, buf: PChar;
  WinHandle,a1: HWnd;
  Msg: TMsg;
  hFile,hFileMapping: THandle;
  number: cardinal;
  ch: char;
  nice: boolean;
  p:Pointer;
 
function MyWndProc(hwnd: hwnd; msg: UINT; wparam: wparam; lparam: lparam): LRESULT;stdcall;
begin
  case Msg of
     WM_KEYDOWN:
    begin
      writefile(hFile, ' WM_KEYDOWN ',13, number, nil);
    end;
 
   WM_KEYUP:
    begin
      writefile(hFile, ' WM_KEYUP ',10, number, nil);
    end;
 
  WM_SYSKEYDOWN:
    begin
      write(p, ' WM_SYSKEYDOWN ',16, number, nil);
    end;
 
  WM_SYSKEYUP:
    begin
      writefile(hFile, ' WM_SYSKEYUP ',14, number, nil);
    end;
 
  WM_CHAR:
    begin
       writefile(hFile, ' WM_CHAR ',9, number, nil);
    end;
 
  WM_DEADCHAR:
   begin
      writefile(hFile, ' WM_DEADCHAR ',13, number, nil);
   end;
 
 WM_SYSCHAR:
    begin
      writefile(hFile, ' WM_SYSCHAR ',15, number, nil);
    end;
 
 WM_SYSDEADCHAR:
    begin
       writefile(hFile, ' WM_SYSDEADCHAR ',20, number, nil);
    end;
 
    WM_DESTROY:
      begin
        PostQuitMessage(0);
        Result := 0;
      end;
 
    else Result := DefWindowProc(hwnd, msg, wparam, lparam);
  end;
end;
 
begin
  szAppName := 'winAPI';
  WndClass.style := CS_HREDRAW or CS_VREDRAW;
  WndClass.lpfnWndProc := @MyWndProc;
  WndClass.cbClsExtra := 0;
  WndClass.cbWndExtra := 0;
  WndClass.hInstance := hInstance;
  WndClass.hIcon := LoadIcon(hInstance, IDI_APPLICATION);
  WndClass.hCursor := LoadCursor(hInstance, IDC_ARROW);
  WndClass.hbrBackground :=GetStockObject(WHITE_BRUSH);
  WndClass.lpszMenuName := nil;
  WndClass.lpszClassName := szAppName;
  RegisterClass(WndClass);
  WinHandle := CreateWindow(WndClass.lpszClassName,
                             'Окно',
                              WS_OVERLAPPEDWINDOW,
                              400,
                              400,
                              550,
                              250,
                              0,
                              0,
                              hInstance,
                              nil);
  ShowWindow(WinHandle, SW_SHOW);
  UpdateWindow(WinHandle);
 
  a1:=OpenFIleMapping(FILE_MAP_WRITE,true, PChar('myfilemapping'));
  if a1=0 then
  begin
  hFile := CreateFile('myfile.txt', GENERIC_READ or GENERIC_WRITE,
                  0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  a1:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,10000,PChar('myfilemapping'));
  end;
 
  p:=MapViewOfFile(a1,FILE_MAP_WRITE,0,0,10000);
 
  while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
20.12.2012, 03:37 3
Оно тебе надо, здесь использовать File Mapping? Проще будет асинхронная запись в файл (ненужное закомментировал, ошибки не обрабатывал) :

Delphi
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
program Project4;
 
uses
  Windows,
  Messages,
  SysUtils;
 
var
   WndClass: TWndClass;
   szAppName : PChar;
   WinHandle : HWnd;
   Msg: TMsg;
 
const
   FileName = 'F:\myfile.txt';
   INVALID_SET_FILE_POINTER = DWORD(-1);
 
var
   hFile : THandle;
 
procedure Log_Append(s : string);
var
   OverLap: OVERLAPPED;
   FSize : DWORD;
   Written : DWORD;
begin
   ZeroMemory(@OverLap, SizeOf(OverLap));
   s := s + sLineBreak;
 
   FSize := GetFileSize(hFile, nil);
   with OverLap do
   begin
      OffsetHigh := 0;
      hEvent := 0;
      Offset := FSize;
   end;
   WriteFile(hFile, s[1], Length(s) * SizeOf(Char), Written, @OverLap);
   // Ошибки не обрабатываются
end;
 
function MyWndProc(hwnd: hwnd; msg: UINT; wparam: wparam; lparam: lparam): LRESULT; stdcall;
begin
   case Msg of
      WM_KEYDOWN:
      begin
         Log_Append('WM_KEYDOWN');
         // writefile(hFile, ' WM_KEYDOWN ',13, number, nil);
      end;
      WM_KEYUP:
      begin
         Log_Append('WM_KEYUP');
         // writefile(hFile, ' WM_KEYUP ',10, number, nil);
      end;
      WM_SYSKEYDOWN:
      begin
         Log_Append('WM_SYSKEYDOWN');
         // writefile(hFile, ' WM_SYSKEYDOWN ',16, number, nil);
      end;
      WM_SYSKEYUP:
      begin
         Log_Append('WM_SYSKEYUP');
         // writefile(hFile, ' WM_SYSKEYUP ',14, number, nil);
      end;
      WM_CHAR:
      begin
         Log_Append('WM_CHAR');
         // writefile(hFile, ' WM_CHAR ',9, number, nil);
      end;
      WM_DEADCHAR:
      begin
         Log_Append('WM_DEADCHAR');
         // writefile(hFile, ' WM_DEADCHAR ',13, number, nil);
      end;
      WM_SYSCHAR:
      begin
         Log_Append('WM_SYSCHAR');
         // writefile(hFile, ' WM_SYSCHAR ',15, number, nil);
      end;
      WM_SYSDEADCHAR:
      begin
         Log_Append('WM_SYSDEADCHAR');
         // writefile(hFile, ' WM_SYSDEADCHAR ',20, number, nil);
      end;
      WM_DESTROY:
      begin
         PostQuitMessage(0);
         Result := 0;
      end;
      else
         Result := DefWindowProc(hwnd, msg, wparam, lparam);
   end;
end;
 
begin
   szAppName := 'winAPI';
   WndClass.style := CS_HREDRAW or CS_VREDRAW;
   WndClass.lpfnWndProc := @MyWndProc;
   WndClass.cbClsExtra := 0;
   WndClass.cbWndExtra := 0;
   WndClass.hInstance := hInstance;
   WndClass.hIcon := LoadIcon(hInstance, IDI_APPLICATION);
   WndClass.hCursor := LoadCursor(hInstance, IDC_ARROW);
   WndClass.hbrBackground :=GetStockObject(WHITE_BRUSH);
   WndClass.lpszMenuName := nil;
   WndClass.lpszClassName := szAppName;
   RegisterClass(WndClass);
   WinHandle := CreateWindow(WndClass.lpszClassName, 'Окно',
      WS_OVERLAPPEDWINDOW, 400, 400, 550, 250, 0, 0, hInstance, nil);
   ShowWindow(WinHandle, SW_SHOW);
   UpdateWindow(WinHandle);
 
   hFile := CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE,
      nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
   // Проверки ошибок нет
 
   while GetMessage(Msg, 0, 0, 0) do
   begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
   end;
 
   CloseHandle(hFile);
   Halt(Msg.wParam);
end.
, пишет и из одного и из двух, и из пяти процессов. Можно сделать по правилам, и вызывать CreateFile в WM_CREATE, а CloseHandle - в WM_DESTROY.
1
20.12.2012, 03:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2012, 03:37
Помогаю со студенческими работами здесь

Статистика биржевой деятельности и статистика спроса
Очень поджимают сроки, сдать нужно ЗАВТРА! Сам сделал 12 задач, думал и с этими справлюсь, но, к...

Глобальная переменная
Здраствуйте, вот интересует такой вопрос: можно ли как-то переменную сделать глобальной так, чтобы...

Глобальная переменная
Хочу что бы при нажатии кнопки test1 присваивалась 6 (так все и есть), а при нажатии test2...

Глобальная переменная
Есть двумерный символьный массив ClusterBuf объявленный глобально. В него,в ходе выполнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru