Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > непонятный глюк


Автор: AGENTxXx 17.2.2010, 00:35
И сново я))) Всем кодерам большущий привет! Постепенно все вот разочаровываюсь в детище майкрософта. Недавно поймал баг в котором такие вот дела: стоит условие, проверка числа, если оно не равно 0 то идем по true иначе false. И что вы думаете... по false идет правильно, а вот когда значение true становится..он просто пропускает условие.. ни туда ни сюда... Странно, не правда ли... Но речь сейчас о другом глюке! Решил я воспроизвести клик с помощью вот этого добра:
Код

case "1":
mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, f.X, f.Y, 0, UIntPtr.Zero);
break;
case "2":
mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, f.X, f.Y, 0, UIntPtr.Zero);
break;

где последовательность идет сразу же 1, а потом 2. Самое странное что если написать так то будет все работать:
Код

mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, f.X, f.Y, 0, UIntPtr.Zero);
mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, f.X, f.Y, 0, UIntPtr.Zero);

т.е. все под case "1" например записать. Но ведь по сути дела эт одно и то же вроде как...
где f - эт коорд точки где производим клик (курсор уже там находится) и когда я щелкаю по кнопке свернуть (закрыть, и скорей всего такой же глюк будет при развернуть) данной программе, происходит нажатие кнопки, а отпускание не происходит. Причем происходит так сказать процесс ожидания.. т.е. прога дальше не выполняется, так как ждет когда же по условию отпустим кнопку мыши.. а отпускать не хочет. В итоге когда я своими силами это сделаю (кликну) то прога думает: о, зашибись, клавишу отпустили и продолжает выполняться. 

В чем косяк? Что может быть не так? 

Сразу говорю: форма программно таскается без проблем, с формой можно делать что хочешь кроме как выполнять эти 3 действия. Если на панели задач нажать на иконку, то она свернется без проблем. С другими формами работает нормально, ну например если указать координаты где находится кнопка закрыть у блокнота то закрывает, сворачивает, разворачивает. Короче, работает как нужно.. а вот с самой прогой которая это все отслеживает и делает - не работает.. Плизз помогите кто знает!!!

Вот, если кому надо, как у меня все выполняется:
Код

private void inkm()
        {
                f.X = Convert.ToInt32(strarray[i]);
                f.Y = Convert.ToInt32(strarray[i + 1]);
                Cursor.Position = f;
                switch (strarray[i + 3]) // тут значение храниться - варианиы case'ов
                {
                    case "1":
                        mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "2":
                        mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "3":
                        mouse_event(MouseFlags.Absolute | MouseFlags.RightDown, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "4":
                        mouse_event(MouseFlags.Absolute | MouseFlags.RightUp, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "5":
                        mouse_event(MouseFlags.Absolute | MouseFlags.MiddleDown, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "6":
                        mouse_event(MouseFlags.Absolute | MouseFlags.MiddleUP, f.X, f.Y, 0, UIntPtr.Zero);
                        break;
                    case "120":
                        mouse_event(MouseFlags.Absolute | MouseFlags.WhellDelta, f.X, f.Y, 120, UIntPtr.Zero);
                        break;
                    case "-120":
                        mouse_event(MouseFlags.Absolute | MouseFlags.WhellDelta, f.X, f.Y, -120, UIntPtr.Zero);
                        break;
                }
                //Cursor.Position = f;
            }
        }

        private void risov()
        {
            try
            {
                if (i < r - 7)
                {
                    inkm();
                    if (strarray[i + 3] != "0")
                        timer1.Interval = Convert.ToInt32(strarray[i + 2]); // тут задержка регулируется, так как вот эта функция в таймере сидит
                    else
                        timer1.Interval = 10;
                    i += 5;
                }
                else
                {
                    inkm();
                    rr2 += timer1.Interval;
                    timer1.Enabled = false;
                }
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message); 
                throw new Win32Exception(); // если честно забыл уже для чего эта строка
            }
        }

Автор: AGENTxXx 17.2.2010, 14:13
Дополнение: если запустить 2 копии проги, и одну запустить на выполнение то она свернет или закроет другую копию => прога робит нормально, но видно происходит какое то другое событие что ли...

Автор: KelTron 17.2.2010, 15:28
Цитата(AGENTxXx @  17.2.2010,  00:35 Найти цитируемый пост)
Но ведь по сути дела эт одно и то же вроде как...

Похоже кому то надо почитать что такое switch и как он работает.

Цитата(AGENTxXx @  17.2.2010,  00:35 Найти цитируемый пост)
Недавно поймал баг в котором такие вот дела: стоит условие, проверка числа

100% ошибка в условии. 

Из твоего кода и описания почти не понятно что происходит. Но судя по тому что я уловил могу посоветовать отлавливать событие не Click, а MouseDown.

Автор: AGENTxXx 17.2.2010, 16:54
Хорошо, если ты говоришь что ошибка в switch то объясни почему с другими прогами все работает шикарно а? Почему не работает только с той, которая запускает этот процесс? на счет бага который по твоему мнению 100% ошибка в условии - постараюсь до понедельника сделать эт в отдельное приложение, и пришлю сюда. Посмотрим где ошибку ты найдешь! Но мне главное ответ на закрытие и свертывание нужен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)