Dziś post programistyczny – ale nie tylko 🙂
Dziś, musiałem napisać kawałek kodu odczytujący wysokość SIP(ang. Soft Input Panel), gdyż był mi on niezbędy do napisania większej części kodu, który ładnie zmienia wyokością elementów, tak by nie były przysłaniane przez klawiaturkę.
Za pomocą wujka google znalzłem, iż można to zdziałać za pomocą natywnej funkcji SipGetInfo – ale z wywołaniem tego pod .NET już było gorzej.
Pierwsza moja implementacja oczywiście natrafiła na problemy z p/invokiem(różne jej wersje powodowały ustawienie LastError na 87 i 6). Oczywiście pierwsze kroki były w stronę: http://pinvoke.net ale nie znalazłem kodu dotyczącego tej funkcji. Zawiodłem się na grupach dyskusyjnych bo pomimo, że kod był to był błędny 🙁
Ostatnią deską ratunku, było dokładniejse przeszperanie google. I bingo…kod był bliżej niż myślałem 🙂 Link . Nie dość, że ten sam adres bloga to jeszcze ten sam schemat :-). Chyba programiści .NET go lubią :-). Ale wracając do tematu – głowną rzecz tam znalazłem, ale nie wszysto. Na szczeście z resztą nie było już problemów.
Poniżej cały kod(komentarze wywaliłem, dla przejrzystości:


[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;

public int width
{
get
{
return right - left;
}
}

public int height
{
get
{
return bottom - top;
}
}
}
[StructLayout(LayoutKind.Sequential)]
public struct SIPINFO
{
public Int32 dwSize;
public Int32 fdwFlags;
public RECT rcVisibleDesktop;
public RECT rcSipRect;
public Int32 dwImDataSize;
public Int32 pvImData;
}

[DllImport("coredll", SetLastError = true)]
private static extern bool SipGetInfo(refSIPINFO si);
public static Rectangle GetSipRect()
{
SIPINFO si = new SIPINFO();
si.dwSize = Marshal.SizeOf(si);

Rectangle rect = Rectangle.Empty;
if (SipGetInfo(ref si))
{
rect = new Rectangle(si.rcSipRect.left, si.rcSipRect.top,
si.rcSipRect.width, si.rcSipRect.height);
}
else
{
//do sth with error
//int err = Marshal.GetLastWin32Error();

}
return rect;
}

Największym zaskoczeniem było złe działanie, kody w przypadku użycia
System.Drawing.Rectangle. W tym przypadku, wysokość (Height) była zapisywana złą wartością. Aby uzyskać wysokość, trzeba napisać:

int sipHeight = r.Height - r.Top


Uff..trochę tego sporo :-), ale może ktoś wykorzysta.

Na sam koniec parę smiesznych rzeczy z okolicznego podwórka 🙂
Podając www.webinside.pl lubelski urząd marszałkowski stracił możliwość uzyskania domeny .eu przez niezapłacenie należnej za nią kwoty wynoszącej 61 zł(aktualnie jakieś ~$19 lub 15,5 euro). Urzędnicy nic sobie z tego nie robią i twierdzą, że mają lepszą: www.lubelskie-region.pl . W rzeczy samej lepsza.

Z rzeczy związanych z blogiem – włączyłem konieczność wpisania słowa przed wysłaniem komentarza oraz Google AdSense(aktualnie czekam na jakąś weryfikację – zobaczymy co z tego wyniknie :-))