• Как поизящнее отключить предварительную обработку касаний сенсорного экрана в Windows 8?

    blackstrip
    @blackstrip Автор вопроса
    Кому интересен ответ на этот вопрос или кто наткнется на этот пост в интернете - вот как отключить:

    Для каждого компонента, с которого хотим убрать "сенсорный слой", чтобы стилус/палец мгновенно нажимал на компонент при нажатии и отпускал его при отпускании пальца без задержек, правого клика по долгому нажатию и т.д.:

    1) Вызываем RegisterTouchWindow из user32.dll с двумя параметрами: HWND компонента и флаг TWF_WANTPALM (флаг говорит винде не расчитывать положение нажатия по всей ладони прижатой, а быстро взять первое касание до сенсора, чтоб не тратить время на распознавание средних координат нажатия "ладонью" на экран).

    RegisterTouchWindow(Form1.Handle,TWF_WANTPALM);

    Если хочется для TImage убрать сенсорный слой - то надо указать HWND родительского компонента, на котором лежит TImage.

    Если у вас прога на разные версии Windows, в том числе на XP и более ранние (где этой функции не было), то можно обойти это дело так:

    type TRTW = function(hwnd: HWND; ulFlags: Cardinal): BOOL; stdcall;
    type UTRTW = function(hwnd: HWND): BOOL; stdcall;
    
    const
    TWF_WANTPALM = $00000002;
    
    var
    touchinited:boolean=false;
    HLib:THandle;
    tou:TRTW;
    utou:UTRTW;
    
    procedure TForm1.InitTouch();
    begin
    try
    Hlib:=LoadLibrary('USER32.DLL');
    if HLib>HINSTANCE_ERROR then
    begin
    tou:=GetProcAddress(Hlib,'RegisterTouchWindow');
    utou:=GetProcAddress(Hlib,'UnregisterTouchWindow');
    if Assigned(tou) and Assigned(utou) then touchinited:=true;
    end;
    except
    if HLib>HINSTANCE_ERROR then FreeLibrary(HLib);
    touchinited:=false;
    end;
    end;


    И тогда вызов регистрации будет выглядеть как:

    if touchinited then tou(Form1.Handle,TWF_WANTPALM);


    2. После регистрации компонента как тач-компонент - вызвать эту процедуру, передав ей HWND компонента (она работает в любом Windows, даже в Windows 95, но без предыдущего шага с RegisterTouchWindows - она толком не подействует ни в Windows 8, ни в Windows 10):

    procedure TForm1.DisablePressAndHold(handa:HWND);
    var
      Atom :TAtom;
    const
      tabletAtom = 'MicrosoftTabletPenServiceProperty';
      TABLET_DISABLE_PRESSANDHOLD = $00000001;
      TABLET_DISABLE_PENTAPFEEDBACK      =$00000008;
      TABLET_DISABLE_PENBARRELFEEDBACK   =$00000010;
      TABLET_DISABLE_FLICKS              =$00010000;
      TABLET_DISABLE_TOUCHUIFORCEON      =$00000100;
      TABLET_DISABLE_TOUCHUIFORCEOFF     =$00000200;
      TABLET_DISABLE_TOUCHSWITCH         =$00008000;
      TABLET_ENABLE_FLICKSONCONTEXT      =$00020000;
      TABLET_ENABLE_FLICKLEARNINGMODE    =$00040000;
      TABLET_DISABLE_SMOOTHSCROLLING     =$00080000;
      TABLET_DISABLE_FLICKFALLBACKKEYS   =$00100000;
      TABLET_ENABLE_MULTITOUCHDATA       =$01000000;
      TABLET_ALL = TABLET_DISABLE_PRESSANDHOLD or TABLET_DISABLE_PENTAPFEEDBACK or TABLET_DISABLE_PENBARRELFEEDBACK or TABLET_DISABLE_FLICKS or TABLET_DISABLE_TOUCHSWITCH or TABLET_DISABLE_SMOOTHSCROLLING or TABLET_DISABLE_FLICKFALLBACKKEYS or TABLET_DISABLE_TOUCHUIFORCEON or TABLET_DISABLE_TOUCHUIFORCEOFF;
    begin
      Atom := GlobalAddAtom(tabletAtom);
      if Atom <> 0 then
      begin
        SetProp(handa, tabletAtom, TABLET_ALL);
      GlobalDeleteAtom(Atom);
      end;
    end;


    3. Перед закрытием программы - надо обратно "разрегистрировать" тач-компоненты примерно так:

    UnregisterTouchWindow(Form1.Handle);

    или для случае динамической подгрузки библиотеки:

    if touchinited then utou(Form1.Handle);

    А потом отпустить библиотеку (хотя, по идее, user32.dll так и останется в памяти, т.к. весьма вероятно задействована другими прогами/библиотеками):

    procedure TForm1.FreeTouch();
    begin
    if HLib>HINSTANCE_ERROR then FreeLibrary(HLib);
    end;


    И тогда все зарегенные и обвешанные тач-свойствами компоненты будут резво реагировать на палец/стилус, мгновенно нажиматься, при удерживании - держать как положено мышку в нажатом состоянии левой кнопки, при отпускании - отпускать.

    Все компоненты, которые не обвесили - будут работать как раньше (с правым кликом по долгому удерживанию и т.п.). На дочерние компоненты эта фича не распространяется (нельзя на окошко кинуть такую штуку и все его компоненты чтоб автоматически тоже стали такими с простыми нажатиями стилусом). Поэтому ручками кидаем RegisterTouchWindow и потом DisablePressAndHold на каждый отвязываемый от "тач-оверлея" компонент. И вроде бы все работает. Проверено:
    - на ноутбуке с Win8 и резистивным экраном, на котором хоть стилусом, хоть пальцем, хоть зубочисткой деревянной можно нажимать
    - на планшете с Win10 и электронным стилусом а ля wacom, который даже просто вблизи экрана без касания - уже елозит точкой по экрану

    p.s. в инете рассматривают также вариант отслеживания очереди сообщений с выделением тач-сообщений. Можно подойти с того конца с этой проблемы, но мне хватило и с этого (надо было TImage сделать рисуемым стилусом, и еще десяток TPanel сделать нажимаемыми пальцем).
    Ответ написан
    Комментировать
  • Как получить изображение с камеры, подключенной к другому компьютеру?

    мой извращенный метод:

    1) пусть на одном компе стоит прога, которая по ftp кидает на твой сайт jpg-снимок с камеры раз в N секунд.

    2) ну а на другом компе просто достаточно залезть через браузер на сайт по адресу этой jpg-картинки и посмотреть ее, ну или скачивать ее своей прогой на этом компе в автоматическом режиме и там уже обрабатывать как надо или сохранять куда надо.
    Ответ написан
  • Как найти количество цифр между двумя заданными?

    Встроенная функция вычитания подойдет для этого =)

    N — первое число
    M — второе число
    количество цифр между ними равно (M-N-1)
    проверка: N = 3, M = 12, тогда M-N-1=12-3-1=8
    Ответ написан
    2 комментария
  • Разработка игры — от идеи до издателя?

    «Речь идёт о обычной, компьютерной игре, достаточно широких масштабов» — о какой игре? Если это MMORPG «достаточно широких масштабов» — то это один вопрос. Если это игра с супернавороченной графикой и уберсетевым режимом 100 на 100 человек для расстреливания друг друга — то это другой вопрос. Если это просто для одного игрока, сидящего без инета дома в теплом кресле — то это третий вопрос.

    Сегодня большинство не-онлайновых игр существуют чисто из-за их простоты в управлении, из-за бесконечного процесса «играния» и неопределенных результатов в каждом уровне (типа Angry Birds, или той игры где на мотоцикле едешь, перекручиваешься в воздухе всегда чтоб не упасть головой в землю и не сломать мотоцикл). Если у вас какая-то подобная идея с перспективой захвата разума масс во всем мире — то это хорошо. Но даже с такой идеей придется основательно вложиться в дизайн, в оформление, в удобство управления. Иначе первый запуск игры, взгляд на страшный стартовый экран, взгляд на некрасивые элементы в самой игре — и все, Alt+F4. Также придется ооочень сильно вложиться в продвижение, в рекламу, потому что наверняка ваша идея есть еще у N человек в мире и они уже делают подобные проекты. Поэтому вам понадобится достаточное количество программистов, дизайнеров, «композиторов» (создателей музыки), чтобы обойти все другие проекты и сделать ваш проект «конфеткой».

    Кроме того, придется выбрать платформу — может быть проще даже продвинуть игру на андроид-планшетах или в соцсетях, потому что много пользователей планшетов и соцсетей зачастую хотят играть. А вот пользователи компьютера — не все хотят.

    А если хотите делать что-то онлайновое — то, например, ходила по интернету статья как сделать MMORPG, которую писал автор игры eternal-lands. Вот она на одном из сайтов, там описаны все трудности процесса создания даже страшноватой на вид игры: www.gamedev.ru/gamedesign/articles/Create_MMORPG

    Для онлайновых MMORPG игр по любому придется писать два куска: клиент и сервер. При этом компьютер для сервера придется где-то размещать чтоб он круглосуточно работал, делать его устойчивым к долгосрочной работе (чтоб игра не падала каждый час), делать устойчивым к читам, исправлять тьму разных багов, добавлять новый контент, новые территории, придумывать новый сюжет, поддерживать игру в актуальном состоянии постоянно, каждую неделю, каждый день. А не просто один раз сделать и забросить. И это еще не считая вышеупомянутых внешнего вида, оформления и дизайна, простоты управления, чтобы конкурировать с другими подобными проектами и быть интересной игрой для пользователей.

    Поэтому вывод такой: оффлайновая игра — не каждый будет сегодня играть в такие игры, даже если это будет суперигра на вид и с захватывающим геймплеем (хотя это еще надо умудриться такую сделать). Онлайновая игра — все что с оффлайновой игрой плюс трудно сетевую часть сделать, надо постоянно поддерживать сервер и саму игру, исправлять разные баги в сервере и клиенте, отлавливать читеров, латать дыры, каждый день думать о ней.
    Ответ написан
    1 комментарий
  • Как можно менять цвет от зеленого к красному, имея на входе только число 0-40?

    0 — это зеленый цвет RGB = (0, 255, 0)
    20 — это желтый цвет RGB = (255, 255, 0)
    40 — это красный цвет RGB = (255, 0, 0)

    Отсюда видно, что от 0 до 20 — растет компонента R от 0 до 255 (а G стоит на 255).
    И что от 20 до 40 — убывает компонента G от 255 до 0 (а R стоит на 255).
    И то, и другое выражается через пропорцию: например, если входное число N <= 20, то R будет равно N*255/20,

    А если входное число N>20, то G = (20-(N-20))*255/20
    (N-20) отнимает от нашего числа стартовые 20.
    а 20-(N-20) инвертирует рост компоненты в убывание, т.к. нам надо чтоб от 20 до 40 — G падало.
    а так это та же самая пропорция, что и для R.
    Ответ написан
    Комментировать
  • Откуда ClickUnder ВКонтакте?

    может траффик перенаправляется через прокси, и туда подмешиваются скрипты с вредными делами. Вот, например, давным давно в мозилле-фаерфоксе прописался в прокси один как «автоматическая настройка». И теперь его не сотрешь. Он у меня еще и в Опере тогда прописался, и в IE. Потом везде потер его. Но в мозилле он что-то не хочет стираться.

    Ответ написан
    Комментировать
  • Программируют ли сейчас вообще под symbian?

    Нокия бросилась под Windows Phone, но и там у нее дела не очень. Symbian плавно умирает, так и есть. Сегодня всем рулят универсальные системы типа Андроида или WP. Бороться с ними Symbian не сможет.
    Ответ написан
  • Научить племянника (10 лет) программированию

    Программировать в 10 лет — это рано очень. Я в 9-10 лет все свободное время проводил на улице, только закончился третий класс, а с ним и математика типа «5 + 3 = ?», «Из точки А в точку Б» (какое там программирование может быть?).

    Позже, в 12-13 лет, я увлекся приставкой денди и играми, и тогда у меня назрели планы «как то бедно сделаны дендевские игры. вот как бы сделать свою собственную игру. там бы был такой герой и такой сюжет, такая музыка, такие разносторонние уровни, типа в первом мы там идем вид сбоку, потом второй вид сверху, потом третий — босса мочить на крыше небоскреба».

    Потом в 8-9 классе (14-15 лет) появился компьютер и брат показал мне qbasic. И я понял что не все так просто с графикой, музыкой и геймплеем как было у меня в мечтах. Тогда же школа дала необходимый математический аппарат чтобы я смог рисовать графики, эмулировать падение предметов по параболе, подпрыгивание типа «с замедлением вверх, остановка в воздухе, с ускорением вниз». Первые игровые программы основывались на денди-играх: гонки «вид сверху», snake rattle and roll где красная голова змеи ползает, подпрыгивает, по пробелу открывает рот, еще всякие танчики вид сверху и т.п.

    А так бейсик был убог по функциональности, пришлось писать свои процедуры на загрузку и быструю отрисовку BMP-картинок, работа с SVGA режимами и банками, защищенный режим, проигрывание WAV файлов и MIDI файлов (точнее изучать готовые решения и испытывать их на своей карте), создание своих шрифтов, которыми можно писать в играх, контроль мыши и клавиатуры, перехват прерываний и т.п. Причем уже с Qbasic 1.0 я перешел на QuickBasic 4.5 (который EXE делает на выходе, а также поддерживает подключение сторонних или своих QLB библиотек), а затем и на QB7.1, библиотеку Future и прочие удобства, делающие из кубейсика многофункционального монстра.

    И уже тогда я дико боялся паскаля (страшный синтаксис). И только на 2 курсе института в 19 лет, когда заставили изучать дельфи в рамках учебного процесса — я уже освоился кое как и в паскале. Потом на 3-4 курсе перешел на си-подобную яву для мобил. И тогда же на ява-подобный Си-шарп по работе.

    В общем, может я и тормоз, и может у кого быстрее все это происходило. Но в 10 лет нет ни знаний математики, ни знаний «а что в этом мире уже спрограммировано и как оно выглядит, как оно играется». Пусть играет в игры, испытывает на прочность чужое, фантазирует — это хороший этап для переходу к написанию своего.

    Хотя я и не знаю, можно ли с сегодняшних уберсупер3дигр перейти на программирование. Там же суперграфика и прочие дела, которые делают студии из нескольких десятков-сотен человек. И собственные бейсиковские труды никто не оценит, т.к. планка качества и красоты современного игрового софта задрана высоко, по сравнению с временем 10-15 лет назад. И доса уже нет, винда не дает поотлаживать ни в бейсике, ни в паскале, криво работает с индексными досовскими палитрами, и вообще не любит эти режимы, защищенный режим вылетает с исключениями. Поэтому кубейсики и паскали, получается, умерли в современной windows.

    Есть от майкрософта виндовский бейсик. Он простой и бесплатный. Такой Qbasic для винды. Вот на нем может быть попробовать? smallbasic.com/
    Ответ написан
    1 комментарий