2011年10月18日 星期二
SAP 與 .NET 整合心得
1. .NET 與 SAP 函數溝通透過 DataTable <--> IRfcTable 兩者間的互相轉換最方便
2. .NET Web Service 與 SAP 函數溝通 DataTable <--> DataSet <--> IRfcTable 三者間的互轉最方便
3. 設計溝通介面函數時使用以上兩個原則,實作系統的速度很快而且具有快速擴充的彈性
4. SAP Connector 本身的問題很多,每次呼叫 RFC 時,Init / Uninit 要寫在同一段處理函數中
5. SAP Connector 也是透過 .NET 撰寫而成,第一次實機部署安裝之後,要記得重新啟動作業系統
7. 由於第六點原因,RFC 呼叫非常耗資源及時間,可以的話盡量將資料另外儲存在自己系統的資料庫中,資料庫沒資料才考慮從 RFC 呼叫取得
8. 多多利用 SAP Logon 等 GUI 工具,文件上寫的往往都不是真的,看 code 才是王道
9. 一有功能要馬上讓使用者試用,並且立即強迫畫押簽收,以免日後發生糾紛時沒有防禦的系統
2011年10月11日 星期二
.NET CF ListView 不支援 OnClick
所以若要取得使用者點選的 ListViewItem 得用 SelectedIndexChanged 來替代,
範例如下:
private void lv_SelectedIndexChanged(object sender, EventArgs e)
{
if (lv.SelectedIndices.Count > 0)
{
ListViewItem lvi = lv.Items[lv.SelectedIndices[0]];
MessageBox.Show(lvi.SubItems[0].Text);
}
}
2011年9月25日 星期日
2011年8月19日 星期五
C# get a string from C++ DLL
TCHAR g_awcMessage[] = L"Hello中文";
char g_aszMessage[] = "Hello中文";
extern "C" __declspec(dllexport) TCHAR* __stdcall GetHelloL()
{
return g_awcMessage;
}
extern "C" __declspec(dllexport) CHAR* __stdcall GetHello()
{
return g_aszMessage;
}
extern "C" __declspec(dllexport) int __stdcall GetInt()
{
return 100;
}
C# P/Invoke:
[DllImport("gpDll.dll")]
public static extern IntPtr GetHello();
[DllImport("gpDll.dll")]
public static extern IntPtr GetHelloL();
[DllImport("gpDll.dll")]
public static extern int GetInt();
private void button1_Click(object sender, EventArgs e)
{
// Not support in CF
//Marshal.PtrToStringAnsi
//Marshal.PtrToStringAuto
// Multibytes 會變成亂碼
string str = Marshal.PtrToStringUni(GetHello());
// Wide Character 顯示正常
string strL = Marshal.PtrToStringUni(GetHelloL());
int n = GetInt();
}
WinCE/Mobile Control Panel Item List
VC++
BOOL ShowControlPanelApplet(int id)
{
TCHAR szParams[32];
SHELLEXECUTEINFO execinfo = {0};
memset(&execinfo, 0, sizeof(execinfo));
execinfo.cbSize=sizeof(execinfo);
execinfo.lpFile=TEXT(“\\windows\\ctlpnl.exe”);
execinfo.lpVerb=TEXT(“open”);
// Id value determines which control applet will be launched
// For e.g. 23 for bluetooth applet
wsprintf(szParams, L”cplmain.cpl,%d”, id);
execinfo.lpParameters = szParams;
BOOL bRet=ShellExecuteEx(&execinfo);
return bRet;
}
VC#
Process.Start(@"\windows\ctlpnl.exe", "cplmain.cpl,19");
Windows Mobile
1 Password
2 Owner Information
3 Power
4 Memory
5 About
6 Brightness
7 Screen
8 Input
9 Sounds & Notifications
10 Remove Programs
11 Menus
12 Buttons
13 Today
14
15 Beam
16 Clocks & Alarms
17 Configure Network Adapters
18 Regional Settings
19 Connections
20
21
22 Manage Certificates
23 Bluetooth
24 Error Reporting
25 GPS Settings
26
27 USB to PC
Windows CE
1 PC Connection - 35#”ctlpnl.exe” \Windows\cplmain.cpl,0
2 Dialing - 35#”ctlpnl.exe” \Windows\cplmain.cpl,1
3 Keyboard - 35#”ctlpnl.exe” \Windows\cplmain.cpl,2
4 Password - 35#”ctlpnl.exe” \Windows\cplmain.cpl,3
5 Owner - 35#”ctlpnl.exe” \Windows\cplmain.cpl,4
6 Power - 35#”ctlpnl.exe” \Windows\cplmain.cpl,5
7 System - 35#”ctlpnl.exe” \Windows\cplmain.cpl,6
8 Display - 35#”ctlpnl.exe” \Windows\cplmain.cpl,7
9 Mouse - 35#”ctlpnl.exe” \Windows\cplmain.cpl,8
10 Stylus - 35#”ctlpnl.exe” \Windows\cplmain.cpl,9
11 Volume & sounds - 35#”ctlpnl.exe” \Windows\cplmain.cpl,10
12 Input Panel - 35#”ctlpnl.exe” \Windows\cplmain.cpl,11
13 Remove Programs - 35#”ctlpnl.exe” \Windows\cplmain.cpl,12
14 Date/Time - 35#”ctlpnl.exe” \Windows\cplmain.cpl,13
15 Certificates - 35#”ctlpnl.exe” \Windows\cplmain.cpl,14
16 Accessibility - 35#”ctlpnl.exe” \Windows\cplmain.cpl,15
SendKeys for .NETCF
So I have to implement it thru APIs,
here is the solutions: SendInput, keybd_event, PostKeybdMessage and SendMessage
[DllImport("coredll.dll", SetLastError = true)]
//[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
[DllImport("coredll", SetLastError = true)]
//[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr FindWindow(string _ClassName, string _WindowName);
[DllImport("coredll", SetLastError = true)]
//[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public static void SendIt()
{
IntPtr ip = FindWindow("notepad", null);
SetForegroundWindow(ip);
const int KEYEVENTF_KEYUP = 0x2;
const int KEYEVENTF_KEYDOWN = 0x0;
byte VK_TAB = 0x0D;
keybd_event(VK_TAB, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
}
| Symbolic constant name | Value (hexadecimal) | Keyboard (or mouse) equivalent |
|---|---|---|
| VK_LBUTTON | 01 | Left mouse button |
| VK_RBUTTON | 02 | Right mouse button |
| VK_CANCEL | 03 | Control-break processing |
| VK_MBUTTON | 04 | Middle mouse button (three-button mouse) |
| VK_BACK | 08 | BACKSPACE key |
| VK_TAB | 09 | TAB key |
| VK_CLEAR | 0C | CLEAR key |
| VK_RETURN | 0D | ENTER key |
| VK_SHIFT | 10 | SHIFT key |
| VK_CONTROL | 11 | CTRL key |
| VK_MENU | 12 | ALT key |
| VK_PAUSE | 13 | PAUSE key |
| VK_CAPITAL | 14 | CAPS LOCK key |
| VK_ESCAPE | 1B | ESC key |
| VK_SPACE | 20 | SPACEBAR |
| VK_PRIOR | 21 | PAGE UP key |
| VK_NEXT | 22 | PAGE DOWN key |
| VK_END | 23 | END key |
| VK_HOME | 24 | HOME key |
| VK_LEFT | 25 | LEFT ARROW key |
| VK_UP | 26 | UP ARROW key |
| VK_RIGHT | 27 | RIGHT ARROW key |
| VK_DOWN | 28 | DOWN ARROW key |
| VK_SELECT | 29 | SELECT key |
| VK_PRINT | 2A | PRINT key |
| VK_EXECUTE | 2B | EXECUTE key |
| VK_SNAPSHOT | 2C | PRINT SCREEN key |
| VK_INSERT | 2D | INS key |
| VK_DELETE | 2E | DEL key |
| VK_HELP | 2F | HELP key |
| 30 | 0 key | |
| 31 | 1 key | |
| 32 | 2 key | |
| 33 | 3 key | |
| 34 | 4 key | |
| 35 | 5 key | |
| 36 | 6 key | |
| 37 | 7 key | |
| 38 | 8 key | |
| 39 | 9 key | |
| 41 | A key | |
| 42 | B key | |
| 43 | C key | |
| 44 | D key | |
| 45 | E key | |
| 46 | F key | |
| 47 | G key | |
| 48 | H key | |
| 49 | I key | |
| 4A | J key | |
| 4B | K key | |
| 4C | L key | |
| 4D | M key | |
| 4E | N key | |
| 4F | O key | |
| 50 | P key | |
| 51 | Q key | |
| 52 | R key | |
| 53 | S key | |
| 54 | T key | |
| 55 | U key | |
| 56 | V key | |
| 57 | W key | |
| 58 | X key | |
| 59 | Y key | |
| 5A | Z key | |
| VK_NUMPAD0 | 60 | Numeric keypad 0 key |
| VK_NUMPAD1 | 61 | Numeric keypad 1 key |
| VK_NUMPAD2 | 62 | Numeric keypad 2 key |
| VK_NUMPAD3 | 63 | Numeric keypad 3 key |
| VK_NUMPAD4 | 64 | Numeric keypad 4 key |
| VK_NUMPAD5 | 65 | Numeric keypad 5 key |
| VK_NUMPAD6 | 66 | Numeric keypad 6 key |
| VK_NUMPAD7 | 67 | Numeric keypad 7 key |
| VK_NUMPAD8 | 68 | Numeric keypad 8 key |
| VK_NUMPAD9 | 69 | Numeric keypad 9 key |
| VK_SEPARATOR | 6C | Separator key |
| VK_SUBTRACT | 6D | Subtract key |
| VK_DECIMAL | 6E | Decimal key |
| VK_DIVIDE | 6F | Divide key |
| VK_F1 | 70 | F1 key |
| VK_F2 | 71 | F2 key |
| VK_F3 | 72 | F3 key |
| VK_F4 | 73 | F4 key |
| VK_F5 | 74 | F5 key |
| VK_F6 | 75 | F6 key |
| VK_F7 | 76 | F7 key |
| VK_F8 | 77 | F8 key |
| VK_F9 | 78 | F9 key |
| VK_F10 | 79 | F10 key |
| VK_F11 | 7A | F11 key |
| VK_F12 | 7B | F12 key |
| VK_F13 | 7C | F13 key |
| VK_F14 | 7D | F14 key |
| VK_F15 | 7E | F15 key |
| VK_F16 | 7F | F16 key |
| VK_F17 | 80H | F17 key |
| VK_F18 | 81H | F18 key |
| VK_F19 | 82H | F19 key |
| VK_F20 | 83H | F20 key |
| VK_F21 | 84H | F21 key |
| VK_F22 | 85H | F22 key |
| VK_F23 | 86H | F23 key |
| VK_F24 | 87H | F24 key |
| VK_NUMLOCK | 90 | NUM LOCK key |
| VK_SCROLL | 91 | SCROLL LOCK key |
| VK_LSHIFT | A0 | Left SHIFT key |
| VK_RSHIFT | A1 | Right SHIFT key |
| VK_LCONTROL | A2 | Left CONTROL key |
| VK_RCONTROL | A3 | Right CONTROL key |
| VK_LMENU | A4 | Left MENU key |
| VK_RMENU | A5 | Right MENU key |
| VK_PLAY | FA | Play key |
| VK_ZOOM | FB | Zoom key |
Emulate mouse action in .NETCF
SendMessage API:
//Find topmost window of another application
IntPtr parentWnd = WIN32.Window.FindWindow(null, "Form2");
//Find the button
IntPtr hButton = WIN32.Window.FindWindowEx(parentWnd, IntPtr.Zero, null, "Target");
//Click the target button
WIN32.Window.SendMessage(hButton, Window.WM.WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
WIN32.Window.SendMessage(hButton, Window.WM.WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
mouse_event API:
[DllImport("coredll.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}
void ClickIt()
{
SetCursorPos(400, 10);
mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}
2008年10月7日 星期二
How to increase volume of application sound on pocket pc
My application plays different sounds in different conditions..all working fine. Only trouble is when incoming call alert is there , sound produced by device (RINGTONE) is loud but sound played by application (parallely to Ringtone) is very low. Does ringtone have a higher priority for the device speaker than our application sound.
A:
Yes in effect the ringtone sound has a higher gain setting than your application audio when an incoming phone call is detected. This is implemented by the concept of "classes".
Further details including details of how you can alter this behaviour can be found in the Windows CE Multimedia Team Blog in an article titled "The WaveDev2 GainClass Implementation" available at
http://blogs.msdn.com/medmedia/archive/2007/01/04/the-wavedev2-gainclass-implementation.aspx