none
[vb 2010] API:SetWindowPos 的用法 RRS feed

  • 問題

  • HI,各位。

    我想問SetWindowPos的用法是怎樣?

    我看過別人寫的,大約是:

    SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE||SWP_NOSIZE)

    如果我要變更一個叫XXX.exe的位置,那麼,我要怎樣寫?

    2010年10月15日 上午 08:34

解答

  • Hi!

    參考以下範例

    請先開個記事本檔案,當程式按下 Button 時,記事本會移動到 20,20

    Public Class Form1
     Public Const HWND_TOP = 0
     Public Const HWND_BOTTOM = 1
     Public Const HWND_TOPMOST = -1
     Public Const HWND_NOTOPMOST = -2
     Public Const SWP_NOSIZE = &H1
     Public Const SWP_NOMOVE = &H2
     Public Const SWP_NOZORDER = &H4
     Public Const SWP_NOREDRAW = &H8
     Declare Auto Function SetWindowPos Lib "user32" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, _
     ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As UInteger) As Boolean
    
     Dim calculatorhandle As IntPtr
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim p = Process.GetProcessesByName("notepad")
      If p.Count > 0 Then
       calculatorhandle = p(0).MainWindowHandle
       SetWindowPos(calculatorhandle, HWND_TOPMOST, 20, 20, 0, 0, SWP_NOSIZE)
      End If
     End Sub
    End Class
    
    

    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 CarbonDiarox 2010年10月17日 上午 09:03
    2010年10月15日 上午 09:01
    版主

所有回覆

  • 參數 類型及說明
    hwnd Long,欲定位的窗口
    hWndInsertAfter Long,窗口控制碼。在視窗列表中,視窗hwnd會置於這個視窗控制碼的後面。也可能選用下述值之一:
    HWND_BOTTOM 將視窗置於視窗列表底部
    HWND_TOP 將窗口置於Z序列的頂部;Z序列代表在分級結構中,視窗針對一個給定級別的視窗顯示的順序
    HWND_TOPMOST 將窗口置於列表頂部,並位於任何最頂部窗口的前面
    HWND_NOTOPMOST 將窗口置於列表頂部,並位於任何最頂部窗口的後面
    x Long,視窗新的x座標。如hwnd是一個子視窗,則x用父視窗的客戶區座標表示
    y Long,視窗新的y座標。如hwnd是一個子視窗,則y用父視窗的客戶區座標表示
    cx Long,指定新的視窗寬度
    cy Long,指定新的視窗高度
    wFlags Long,包含了旗標的一個整數
    SWP_DRAWFRAME 圍繞視窗畫一個框
    SWP_HIDEWINDOW 隱藏視窗
    SWP_NOACTIVATE 不啟動窗口
    SWP_NOMOVE 保持當前位置(x和y設定將被忽略)
    SWP_NOREDRAW 視窗不自動重畫
    SWP_NOSIZE 保持當前大小(cx和cy會被忽略)
    SWP_NOZORDER 保持窗口在列表的當前位置(hWndInsertAfter將被忽略)
    SWP_SHOWWINDOW 顯示視窗
    SWP_FRAMECHANGED 強迫一條WM_NCCALCSIZE消息進入視窗,即使視窗的大小沒有改變
    2010年10月15日 上午 08:35
  • Hi!

    參考以下範例

    請先開個記事本檔案,當程式按下 Button 時,記事本會移動到 20,20

    Public Class Form1
     Public Const HWND_TOP = 0
     Public Const HWND_BOTTOM = 1
     Public Const HWND_TOPMOST = -1
     Public Const HWND_NOTOPMOST = -2
     Public Const SWP_NOSIZE = &H1
     Public Const SWP_NOMOVE = &H2
     Public Const SWP_NOZORDER = &H4
     Public Const SWP_NOREDRAW = &H8
     Declare Auto Function SetWindowPos Lib "user32" (ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, _
     ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As UInteger) As Boolean
    
     Dim calculatorhandle As IntPtr
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Dim p = Process.GetProcessesByName("notepad")
      If p.Count > 0 Then
       calculatorhandle = p(0).MainWindowHandle
       SetWindowPos(calculatorhandle, HWND_TOPMOST, 20, 20, 0, 0, SWP_NOSIZE)
      End If
     End Sub
    End Class
    
    

    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 CarbonDiarox 2010年10月17日 上午 09:03
    2010年10月15日 上午 09:01
    版主
  • 我的經驗並不會這麼順利成功,比如說前一個視窗的選單被選擇的情況下。

    我最後是每個 API 呼叫完,檢查視窗是否已到前景,還不行就用 Key 來模擬。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年10月15日 下午 12:17
  • 謝謝ohoh,

    如果我要取得某程式的位置和size,要怎樣寫?

    2010年10月16日 上午 04:40
  • 嗯~我會注意的,謝謝
    2010年10月16日 上午 04:42
  • 謝謝ohoh,

    如果我要取得某程式的位置和size,要怎樣寫?


    GetWindowRect

    http://www.pinvoke.net/default.aspx/user32.getwindowrect


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年10月16日 上午 04:48
    版主