BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki
coomodore
coomodore
232 pkt.
Junior

 
0


Witam. Zauważyłem dnia dzisiejszego pewien niepokojący fakt. Mianowicie w projekcie mam zainstalowanego hooka na mychę. Wszystko działa jak działać powinno do czasu gdy zużycie procesora zaczyna sięgać 99%, a moja aplikacja ma wykonać jakieś zadanie. Wtedy to myszka zaczyna "haczyć".Przykładowo: 1. uruchamiam grę (zużycie procka ~100%)2. uruchamiam moj program i zaczynam czytać z dysku dane + dodawać je do odpowiednich kolekcji itd..  w tym miejscu mycha zaczyna ciąć.Zaznaczę, że operacje odczytu itd  wykonywane są asynchronicznie przy ustawionym Thread.CurrentThread.Priority = ThreadPriority.Lowest; Zmiana ustawień prowadzi tylko do tego, że mycha częściej lub rzadziej "haczy"Odinstalowanie hooka....odblokowuje mychę, tylko nie bardzo mogę to zrobić (wbrew logice aplikacji, hook na mychę może być potrzebny do wykonywania innych czynnośći).Rozumiem, że aplikacja może działać wolno lub być dyskreminowana ze względu na ustawienia priorytetów, ale nie powinno mieć to wpływu na myszkę (tak myślę).Proszę o jakieś pomysły :)DirectInput...raczej odpada.Edit-1-// btw .... zamieściłem szczątkowe kody aplikacji  która rozwiązuje problem komunikacji między oknamiza pomocą bridgów ( ideologicznie bliskie programowaniu opertemu o wzorce projektowe ). Edit - 2 -// chyba czeka mnie jednak implementacja directInput-a ;(((Edit -3 -// Jeżeli ktoś kiedyś by miał podobny problem to jedynym rozwiązaniem jakie udało mi się wkodować jest stworzenie WMI providera  uruchomienie go w oddzielnej aplikacji i nasłuchiwanie w macierzystej.
tagi: WMI
...keep walking





tomaszs2
tomaszs2
751 pkt.
Senior
 
0


Czy moglbys podeslac jakis kod jak uzywasz hooka?

 

Powinieneś zacząć mnie śledzić kliknij tutaj

coomodore
coomodore
232 pkt.
Junior
 
0


[Kod C#]using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using Hooks;using Hooks.Win32;namespace UIBridge{    public abstract class UIBridge:  IMouseHookable    {                private MouseHook _Mouse;        private bool _IsMouseHookInstalled = false;        public UIBridge()        {            _Mouse = new MouseHook();        }               #region IMouseHookable Members        void IMouseHookable.InstallMouseHook()        {            _Mouse.Install();            _IsMouseHookInstalled = true;        }        void IMouseHookable.UninstallMouseHook()        {            _Mouse.Uninstall();            _IsMouseHookInstalled = false;        }        bool IMouseHookable.IsMouseHookInstalled        {            get { return _IsMouseHookInstalled; }        }        bool IMouseHookable.Enable        {            get { return _Mouse.Enable; }            set { _Mouse.Enable = value; }        }        event MouseEventHandler IMouseHookable.MouseMove        {            add             {                _Mouse.MouseMove += value;            }            remove             {                _Mouse.MouseMove -= value;            }        }        event MouseEventHandler IMouseHookable.MouseUp        {            add             {                _Mouse.MouseUp += value;            }            remove             {                _Mouse.MouseUp -= value;            }        }        event MouseEventHandler IMouseHookable.MouseDown        {            add     &n

...keep walking
tomaszs2
tomaszs2
751 pkt.
Senior
 
0


W tym miejscu:[Kod C#] // .. obsługa nic ważnegopowinno być jak najmniej przetwarzania. To zdarzenie przychodzi bardzo często z hooka i jeżeli tam nie zadbasz o to, żeby wykonywać tylko minimalny zestaw instrukcji, to procesor będzie zajęty non-stop.

 

Powinieneś zacząć mnie śledzić kliknij tutaj

coomodore
coomodore
232 pkt.
Junior
 
0


W tamtym miejscu  jest tylko  proste przypisanie.Ustalmy, że nic tam nie ma lub, że wogóle nie obsługuje zdarzeń związanych z hookiem. Problemem nie jest to, że hook zużywa  za dużo procka (bo tak nie jest). Sęk w tym, że podczas gdy program wykonuje coś co wymaga użycia ~100% procka. Mycha  zaczyna "szarpać" bez względu na to czy obsługuję jakieś zdarzenie związane z hookiemna mychę czy nie.  Wystarczy, że hook jest zainstalowany w systemie.

...keep walking
tomaszs2
tomaszs2
751 pkt.
Senior
 
0


No to odepnij hooka na czas tych złożonych operacji:[Kod C#]Mouse.MouseDown -= new MouseEventHandler(LiseUIManager_MouseDown);

 

Powinieneś zacząć mnie śledzić kliknij tutaj

coomodore
coomodore
232 pkt.
Junior
 
0


hehe...Troszeczkę się nie zrozumieliśmy ;)Uruchamiałem program  rowniez bez subskrybcji zdarzeń  i zero poprawy. Wystarczy, że mam zainstalowanego  hooka i tak się dzieje. Umieszczam tutaj kod jaki używam do obsługi hooka.[Kod C#]using System;using System.Runtime.InteropServices;namespace Hooks.Win32{    public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);    #region HookTypes    // WinUser.h    public enum HookType    {        WH_MSGFILTER = -1,        WH_JOURNALRECORD = 0,        WH_JOURNALPLAYBACK = 1,        WH_KEYBOARD = 2,        WH_GETMESSAGE = 3,        WH_CALLWNDPROC = 4,        WH_CBT = 5,        WH_SYSMSGFILTER = 6,        WH_MOUSE = 7,        WH_HARDWARE = 8,        WH_DEBUG = 9,        WH_SHELL = 10,        WH_FOREGROUNDIDLE = 11,        WH_CALLWNDPROCRET = 12,        WH_KEYBOARD_LL = 13,        WH_MOUSE_LL = 14    }    #endregion    #region Win32 Messages    // WinUser.h    public enum Win32Message    {        WM_KEYDOWN = 0x0100,        WM_KEYUP = 0x0101,        WM_SYSKEYDOWN = 0x0104,        WM_SYSKEYUP = 0x0105,        WM_MOUSEMOVE = 0x0200,        WM_LBUTTONDOWN = 0x0201,        WM_LBUTTONUP = 0x0202,        WM_LBUTTONDBLCLK = 0x0203,        WM_RBUTTONDOWN = 0x0204,        WM_RBUTTONUP = 0x0205,        WM_RBUTTONDBLCLK = 0x0206,        WM_MBUTTONDOWN = 0x0207,        WM_MBUTTONUP = 0x0208,        WM_MBUTTONDBLCLK = 0x0209,        WM_MOUSEWHEEL = 0x020A    }    #endregion    public struct KBDLLHOOKSTRUCT    {        public int vkCode;        public int scanCode;        public int flags;        public IntPtr extraInfo;    }    public struct POINT    {        public int X;        public int Y;    }    public struct MSDLLHOOKSTRUCT    {        public POINT pt;        public int mouseData;        public int flags;        public int time;        public IntPtr dwExtraInfo;    }    public static class Functions    {        [DllImport("user32.dll")]        public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc proc, IntPtr hMod, int threadId);        [DllImport("user32.dll")]        public static extern bool UnhookWindowsHookEx(IntPtr hHook);        [DllImport("user32.dll")]        public static extern i

...keep walking
coomodore
coomodore
232 pkt.
Junior
 
0


Hooka na mychę stawiam tak jak został umieszczony w artykule  autorstwa Maciej Aniserowicz -a http://www.codeguru.pl/article-606.aspxProblem zaczyna się gdy w oknie DictionaryForm  // dictionary wykonuję jakąś procesoro żerną operację.  Wtedy myszka zaczyna "haczyć".

...keep walking

Udziel odpowiedzi

pkt.
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.