2011年11月30日 星期三

#VB 透過API,控制其他視窗程式顯示行為


'User32.dll API, FindWindowA去尋找開啟視窗
Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String,
ByVal lpWindowName As String) As Integer

'控制視窗狀態
Declare Function ShowWindow Lib "User32" (ByVal hWnd As Integer,
ByVal nCmdShow As Integer) As Integer

'Lock Window
Declare Function EnableWindow Lib "user32" Alias "EnableWindow" (ByVal hwnd As Integer, ByVal fEnable As Boolean) As Integer


'目前還不清楚為什麼無法隱藏
 工作管理員的應用程式,已經成功影藏
 但是介面還是可以看到
 可能要再隱藏子視窗之類的

目前先透過EnableWindow
將視窗鎖住,無法操控視窗介面,無法關閉

再來就看啟動的時候應該怎麼載入
或是透過啟動主程式之後再啟動Scand介面

=================================================================
这个,,,可能是因为你调用B程序时初始是SW_HIDE的,,但B程序里的CreateWindow完后又ShowWindow函数又把窗口Show出来了。。。
所以,,,你要根本解决这问题 就得用CreateProcess函数来代替ShellExecute



================================================================


hwnd視窗的名稱 (不知道這樣解釋對不對)
lpOperation進行的操作,如"open","print","explore"分別對應 "開啟","列印","瀏覽", 也可以為空(""),此時表示進行預設的操作。
lpFile要操作的文件。
lpParameters如果lpFile指定的是一個可執行檔則表示參數
lpDirectory操作進行的目錄
nShowCmd新的應用程式的運行方式。其可用的值如下:
SW_HIDE隱藏
SW_MAXIMIZE最大化
SW_MINIMIZE最小化,並把Z order順序在此視窗之後(即視窗下一層)的視窗啟動
SW_RESTORE啟動視窗並還原為初始化大小
SW_SHOW以當前大小和狀態啟動視窗
SW_SHOWDEFAULT以預設方式運行
SW_SHOWMAXIMIZED啟動視窗並最大化
SW_SHOWMINIMIZED啟動視窗並最小化
SW_SHOWMINNOACTIVE最小化但不改變當前啟動的視窗
SW_SHOWNA以當前狀態顯示視窗但不改變當前啟動的視窗
SW_SHOWNOACTIVATE以初始化大小顯示視窗但不改變當前啟動的視窗
SW_SHOWNORMAL啟動並顯示視窗,如果是最大(小)化,視窗將會還原。第一次運行程式 時應該使用這個值


============================================================

[VB.NET]使用WinAPI的FindWindow判斷程式是否運行



================================================

[C#] 使用 Win32 API 來進行控制其他程式視窗行為表現



延续如何隐藏"开始"菜单的话题
隐藏Window工作列(Taskbar)的做法,跟隐藏"开始"菜单相同,所以一同提出

Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
       (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function SetWindowPos Lib "user32" _
       (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
         ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
         ByVal cy As Long, ByVal wFlags As Long) As Long
  
Public Const SWPHIDEWINDOW = &H80     '显示视窗
Public Const SWPSHOWWINDOW = &H40     '隐藏视窗
'---------------------------------------------------------------------------------

Sub HideTaskbar()
    Dim hWndT As Long
    hWnd = FindWindow("shell_traywnd", vbNullString)
    SetWindowPos hWnd, 0, 0, 0, 0, 0, SWPHIDEWINDOW
End Sub
'----------------------------------------------------------------------------------

Sub ShowTaskbar()
    Dim hWnd As Long
    hWnd = FindWindow("shell_traywnd", vbNullString)
    SetWindowPos hWnd, 0, 0, 0, 0, 0, SWPSHOWWINDOW
End Sub


================================================================

CWnd::SetWindowPos




 PInvoke 簽章的呼叫慣例及參數與目標 Unmanaged 簽章是否相符
http://social.msdn.microsoft.com/Forums/zh-HK/233/thread/f7089c7b-219f-41f4-9ac1-4ca724a39799




        Dim Handle As IntPtr
        '找開啟視窗程式名稱,傳回integer
        Handle = FindWindow(0&, WindowName)  = > 簽章不相符


    FindWindow( ClassName參數, 視窗標題名稱WindowName參數)
      = >     FindWindow( Nothing, WindowName)
這樣就可以了
 

剛剛突然一想 他說我沒宣告 我就宣告一個NULL
private:
/// <summary>
/// 設計工具所需的變數。
String^ NULL;
/// </summary>
結果就可以了@@ 
到此結案!!

#VB ODBC CommandBuilder With Transaction


VB Net CommandBuilder with Transaction (ODBC)



        Dim cbWarehouse As New SqlCommandBuilder(daWarehouse)
        Dim warehouseDelete As SqlCommand = cbWarehouse.GetDeleteCommand()
        Dim warehouseInsert As SqlCommand = cbWarehouse.GetInsertCommand()
        Dim warehouseUpdate As SqlCommand = cbWarehouse.GetUpdateCommand()

       Dim cbSite As New SqlCommandBuilder(daSite)
        Dim siteDelete As SqlCommand = cbSite.GetDeleteCommand()
        Dim siteInsert As SqlCommand = cbSite.GetInsertCommand()
        Dim siteUpdate As SqlCommand = cbSite.GetUpdateCommand()

        ' Fill the DataSet.
        daWarehouse.Fill(ds, "WarehouseInventory")
        daSite.Fill(ds, "SiteInventory")

        ' Begin the transaction and enlist the commands.
        Dim tran As SqlTransaction = conn.BeginTransaction()
        warehouseDelete.Transaction = tran
        warehouseInsert.Transaction = tran
        warehouseUpdate.Transaction = tran
        siteDelete.Transaction = tran
        siteInsert.Transaction = tran
        siteUpdate.Transaction = tran



       'Commit the transaction
            tran.Commit()
        Catch ex As SqlException
            'Roll back the transaction.

            'Additional error handling if needed.
            tran.Rollback()
        Finally
            ' Close the connection.
            conn.Close()
        End Try

2011年11月29日 星期二

#Excel 行列排序

1.原本區塊改成文本模式


2.在新區塊第一格輸入
=SMALL($A$1:$C$3,(ROW(A1)-1)*3+COLUMN(A1))

3.拖拉複製內容直到與原區塊相當
   新區塊完成原本區塊排序

2011年11月28日 星期一

#VB Optional Parameters


C# 4.0 選擇性參數 (Optional Parameters)

可減少多載函式的建立,卻可達到相同的效果,加快使用者開發。

Private Function ExecuteWithOdbc(ByVal SQL As String,
 Optional ByVal parameters As Odbc.OdbcParameterCollection = Nothing) As Integer
使用上必須提供 預設數值
當不帶入參數的時候,自動帶入預設值
做到類似多載的效果



==========================================================
'下面會發生 [無法互相多載, 差異只在選擇性參數不同]
image

Public Function Execute(ByVal SQL As String,
 Optional ByVal parameters As SqlClient.SqlParameterCollection = Nothing) As Integer
Return ExecuteWithSqlClient(SQL, parameters)
End Function

Public Function Execute(ByVal SQL As String,
 Optional ByVal parameters As Odbc.OdbcParameterCollection = Nothing) As Integer
Return ExecuteWithOdbc(SQL, parameters)
End Function


'似乎可以透過傳遞物件,之後再轉型處理

Public Function Execute(ByVal SQL As String,
Optional ByVal parameters As Object = Nothing) As Integer

If m_bUseODBC Then
  '透過ODBC連線,參數轉型OdbcParameterCollection
  Return ExecuteWithOdbc(SQL, DirectCast(parameters, Odbc.OdbcParameterCollection))
Else
  '透過SQL Client連線,參數轉型SqlParameterCollection
  Return ExecuteWithSqlClient(SQL, DirectCast(parameters, SqlClient.SqlParameterCollection))
End If

End Function