Referenced package not found File: Device Connectivity Component

Adam Dudzik | .NET Compact Framework, Urządzenia mobilne | 1 czerwca 2010

Rozwiązanie problemu zawartego w tytule:)

Wystarczy zamknąć Visual Studio i wejść do:

C:\Documents and Settings\<uzytkownik> \Ustawienia lokalne\Dane Aplikacji\Microsoft\

zmienić nazwę katalogu CoreCon i ponownie uruchomićVS.

Zdalny dostęp do ekranu urządzenia przenośnego (ciąg dalszy)

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 31 marca 2010

W nawiązaniu do wpisu Zdalny dostęp do ekranu urządzenia przenośnego podaje kolejną aplikację umożliwiająca wygodniejsze operacje na ekranie terminala mobilnego. Jest to dość stary (ostatnia wersja z 2001/11/27) już rCe dostępny wraz z innymi aplikacjami pod tym adresem.  Freeware.

Ukrycie paska postępu - WebBrowser, CF2.0

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 1 stycznia 2010

Niejako uzupełniając zagadnienie poruszone w wpisie Blokada ContextMenu na komponencie WebBrowser chcę Wam przedstawić sposób ukrycia paska postępu ładowania strony. Pojawia się on zawsze w dolnej części komponentu WebBrowser i czasami może być denerwujący :).

Całość zagadnienia sprowadza się do wywołania funkcji DestroyWindow z biblioteki coredll.dll .

Kod wygląda następująco (podobnie jak poprzednio tworze własną kontrolkę dziedzicząc po WebBrowser - wydaje mi sie to najprostszym rozwiązaniem)

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child, pieHtml;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll")]
        private static extern bool DestroyWindow(IntPtr hwnd);  

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            pieHtml = GetWindow(child, 5); //MSPIE Status

            DestroyWindow(pieHtml);

            base.OnHandleCreated(e);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Oczywiście nic nie stoi na przeszkodzie by połączyć to z ukrywaniem ContextMenu. Uzyskany kod powinien  wyglądać następująco

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child, pieHtml;
        private static WndProcDelegate newWndProc;
        private static IntPtr oldWndProc = IntPtr.Zero, oldSipProc = IntPtr.Zero;

        internal const int GWL_WNDPROC = -4;
        internal const int WM_LBUTTONUP = 0x0202;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("coredll.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);

        [DllImport("coredll.dll")]
        private static extern int PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        [DllImport("coredll.dll")]
        private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("coredll.dll")]
        private static extern bool DestroyWindow(IntPtr hwnd);  

        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            pieHtml = GetWindow(child, 5); //MSPIE Status
            child = GetWindow(pieHtml, 2); //PIEHTML

            newWndProc = new WndProcDelegate(WndProc);
            oldWndProc = GetWindowLong(child, GWL_WNDPROC);
            int success = SetWindowLong(child, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));

            DestroyWindow(pieHtml);

            base.OnHandleCreated(e);
        }

        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            if (msg == 0x0020)
            {
                PostMessage(this.Handle, WM_LBUTTONUP, 0, 0);
                return IntPtr.Zero;
            }

            return CallWindowProc(oldWndProc, child, msg, wParam, lParam);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Blokada ContextMenu na komponencie WebBrowser

Adam Dudzik | .NET Compact Framework, Informatyka, Urządzenia mobilne | 19 grudnia 2009

Jeśli używacie kontrolki WebBrowser z Compact Frameworka 2.0 zapewne spotkaliście się z ContextMenu pojawiającym sie za każdym razem gdy przytrzymacie zbyt długo rysik (zdarzenie Tap&Hold). Moim zdaniem jest to dość uciążliwe, w pewnych przypadkach pojawiające się ContextMenu jest wysoce niepożądane. Jako że potrzeba matką wynalazków postanowiłem sam zmierzyć sie z tematem i potyczka ta została zakończona sukcesem :)

 

Całość zagadnienia sprowadziła się do wpięcia w procedurę obsługi okna. Na początek gotowy kod.

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Dudzik.Helpers
{
    public class WebBrowserExt : System.Windows.Forms.WebBrowser
    {
        private IntPtr child;
        private static WndProcDelegate newWndProc;
        private static IntPtr oldWndProc = IntPtr.Zero, oldSipProc = IntPtr.Zero;

        internal const int GWL_WNDPROC = -4;
        internal const int WM_LBUTTONUP = 0x0202;

        [DllImport("coredll")]
        extern static IntPtr GetCapture();

        [DllImport("coredll.dll", EntryPoint = "GetWindow")]
        private static extern IntPtr GetWindow(IntPtr handleWindow, int cmd);

        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("coredll.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);

        [DllImport("coredll.dll")]
        private static extern int PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

        [DllImport("coredll.dll")]
        private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

        protected override void OnHandleCreated(EventArgs e)
        {
            IntPtr webHandle = GetHWND(this);
            child = GetWindow(webHandle, 5);
            child = GetWindow(child, 5);
            child = GetWindow(child, 2);

            newWndProc = new WndProcDelegate(WndProc);
            oldWndProc = GetWindowLong(child, GWL_WNDPROC);
            int success = SetWindowLong(child, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));

            base.OnHandleCreated(e);
        }

        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            if (msg == 0x0020)
            {
                PostMessage(this.Handle, WM_LBUTTONUP, 0, 0);
                return IntPtr.Zero;
            }

            return CallWindowProc(oldWndProc, child, msg, wParam, lParam);
        }

        private IntPtr GetHWND(Control ctl)
        {
            ctl.Capture = true;
            IntPtr hWnd = GetCapture();
            ctl.Capture = false;
            return hWnd;
        }
    }
}

Proponuje również utworzyć odpowiedni plik xmta. Pozwoli on na bezproblemowe użycie kontrolki w Design Mode. Poniżej najprostsza zawartość pliku xmta.

<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="Dudzik.Helpers.WebBrowserExt">
    <DesktopCompatible>true</DesktopCompatible>
    <Property Name="Size">
      <DefaultValue>
        <Type>
          System.Drawing.Size, System.Drawing, Version=2.0.0.0,
          Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
        </Type>
        <Value>
          240; 100
        </Value>
      </DefaultValue>
    </Property>
  </Class>
</Classes>

The page you are looking for cannot be found due to unknown error 0×80072f78

Adam Dudzik | Urządzenia mobilne | 17 sierpnia 2008

W przypadku gdy z poziomu terminala/palmtopa podłączonego do komputera przez USB i ActiveSync występuje problem z dostepem do sieci, przegladaniem stron za pomocą PIE i gdy w tym drugim przypadku problem przejawia sie komunikatem “The page you are looking for cannot be found due to unknown error 0×80072f78″ należy dodać do rejestru komputera dodać następujący wpis:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services]
"AllowLSP"=dword:00000000

Pobierz LSPvalue.reg

Microsoft prezentuje Windows Mobile 6.1

Adam Dudzik | Urządzenia mobilne | 3 kwietnia 2008

1 kwietnia 2008 na konferencji w Las Vegas Microsoft zaprezentował nowy system operacyjny dla urządzeń mobilnych Windows Mobile 6.1. Poniżej filmik prezentujący możliwości nowego systemu.


Video: Windows Mobile 6.1
Linki:

http://www.microsoft.com/presspass/press/2008/apr08/04-01WM61PR.mspx

http://blogs.msdn.com/windowsmobile/archive/2008/04/02/video-demos-of-cool-new-windows-mobile-6-1-features.aspx

Zdalny dostęp do ekranu urządzenia przenośnego

Adam Dudzik | Urządzenia mobilne | 28 marca 2008

Swego czasu pisałem aplikacje na przenośny terminal firmy Symbol MC1000. Urządzenie całkiem fajne, ma jednak jeden poważny feler - brak ekranu dotykowego. Komplikuje to odrobinę sytuację ponieważ terminal ten oparty jest o system bądź co bądź okienkowy - Windows CE 4.2 - skutkiem czego wszystkie operacje trzeba wykonywać poprzez klawiaturę. Klawiatura zaś nie jest wygodną klawiaturą pecetową tylko zbiorem 21 klawiszy gdzie wprost wprowadza się tylko cyfry - wprowadzanie innych znaków (litery, klawisze funkcyjne, shift,control, esc) wymaga użycia kombinacji klawiszy na miarę kombosów z gry Street Fighter. Wrodzone lenistwo nie pozwoliło mi tak zostawić tego problemu i znalazłem rozwiązanie które pozwala mi mieć podgląd ekranu terminala na laptopie i z poziomu laptopa wykonywać operacje na ekranie terminala - takie mobilne RDP :)

 

1. Windows Mobile Developer Power Toys

W tym pakiecie (do ściągnięcia stąd) znajduje się aplikacja ActiveSync Remote Display. Do działania wymaga programu ActiveSync, nie ma potrzeby instalowania oprogramowania po stronie PDA, dużą zaletą jest cena (0 zł), wadą jest to że działa tylko za pośrednictwem ActiveSync.

2. Pocket Controller-Pro

Oprogramowanie firmy SOTI (do ściągnięcia stąd ). Podgląd i kontrola ekranu to tylko część możliwości tej aplikacji. W pakiecie zawarty dodatkowo jest przeglądarka plików, edytor rejestru, task manager. Możliwe też jest rejestrowanie ekranu terminala w postaci filmu lub kolejnych “zdjęć” oraz synchronizacja plików. Najważniejszym wydaje się to ze terminal można kontrolować nie tylko za pośrednictwem ActiveSync ale również poprzez sieć TCP/IP. Wadą wydaje się być cena.

 

EDIT:

Znalazłem jeszcze jeden program My Mobiler. Oferuje łączność przez ActiveSync oraz poprzez sieć TCP/IP, nagrywanie filmów, robienie zrzutów ekranowych, pełną obsługe za pomocą klawiatury i myszki oraz menadżer plików. Do tego jest darmowy. Polecam

VMWare a emulatory urządzeń mobilnych z Visual Studio 2003

Adam Dudzik | Urządzenia mobilne | 25 marca 2008

Tak na szybko: emulatory z Visual Studio 2003 nie działają pod VMWare.

PS. Ktoś wie jak to wygląda z Visual Studio 2005, ew. pod VirtualPC?

EDIT:

VirtualPC nie obsługuje USB ale prawdopodobnie działa pod nim emulator. Tym samym mamy możliwe dwa scenariusze:

1. VMWare - nie działa emulator ale możemy korzystać z USB.
2. VirtualPC - działa emulator ale nie możemy korzystać z USB

PlatformNotSupportedException

Adam Dudzik | Urządzenia mobilne | 24 marca 2008

Co jakiś czas spotykam sie z wyjątkiem PlatformNotSupportedException. Prawie zawsze występuje w momencie łączenia się z poziomu terminala z ‘dużą bazą’(MSSQL) na pececie. Problem leży w tym że terminal nie wspiera locale odpowiedniego dla bazy działającej po stronie peceta. Wydawałoby sie ze jedynym wyjściem w takiej sytuacji jest napisanie webserwisu który udostępni nam potrzebne dane bądź szukanie innego sposobu na wymianę danych. Jednakże da się prościej. W przypadku urządzeń z Windows CE 5.0 na pokładzie należy zdobyć urządzenie z Windows Mobile 5.0 i skopiować z katalogu \Windows plik wince.nls. Tym plikiem należy nadpisać oryginalny plik na urządzeniu z Windows CE 5.0, oraz wykonać warm boot. W przypadku urządzeń z Windows CE 4.2 należy z urządzenia z Windows Mobile 2003 skopiować ten sam plik i nadpisać nim plik na urządzeniu z Windows CE 4.2, oraz wykonać warm boot. Po restarcie w oknie Regional Settings powinny sie pokazać nowe dostępne locale.

Wyłączenie kreatora synchronizacji - ActiveSync

Adam Dudzik | Urządzenia mobilne | 29 lutego 2008

Jeśli korzystasz z ActiveSync i denerwuje Cię pojawiające sie po każdym wpięciu urządzenia do komputera okno Kreatora synchronizacji urządzenia Pocket PC a nie chcesz tworzyć powiązania synchronizacji między komputerem osobistym i telefonem to wypróbuj to:

REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services]
"GuestOnly"=dword:00000001

Polski Wordpress
Oparte na WordPress | Theme by Roy Tanck. Tłumaczenia dokonał azWeb dla Polski support WordPress