C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 自フォームの前に使っていたフ゜ロセスの取得。


(過去ログ 92 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■54815 / inTopicNo.1)  自フォームの前に使っていたプロセスの取得。
  
□投稿者/ たけたけ (1回)-(2010/11/03(Wed) 13:56:05)

分類:[VB.NET/VB2005 以降] 

お世話になります。
いろいろ調べたのですが、どうしてもわかりません。どなたがアドバイスをお願いします。

クリップボードに登録したデータを、自フォームのボタンをクリックして、直前に使っていたプログラム(notepad等)に書き込もうと思っています。
下記のパターン1、パターン2を試したのですが、プロセスは取れるのですが、希望した順ではなく、どうしてもうまくいきません。
(パターン2はコメントアウトしてあるGetNetWindowもダメでした。notepadのプロセスを直接していして、書き込むとうまくいきました。)

Windows7 64bit VS2010 初心者です。よろしくお願いします。

  Enum GetWindow_Cmd
    GW_HWNDFIRST = 0
    GW_HWNDLAST = 1
    GW_HWNDNEXT = 2
    GW_HWNDPREV = 3
    GW_OWNER = 4
    GW_CHILD = 5
    GW_ENABLEDPOPUP = 6
  End Enum
  Public Const WM_SETTEXT = &HC

  Declare Function GetForegroundWindow Lib "user32" () As IntPtr
  Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hWnd As IntPtr, ByVal wFlag As Integer) As IntPtr
  Declare Function GetWindow Lib "user32" (ByVal hWnd As IntPtr, ByVal uCmd As Integer) As IntPtr
  Public Declare Function GetWindowThreadProcessId Lib "user32.dll" _
                            (ByVal hWnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    'パターン1
    Dim Processes As Process() = Process.GetProcesses
    Dim id As Integer = 0
    Dim ProcessNamePat1(Processes.Length - 1) As String
    For i As Integer = Processes.Length - 1 To 0 Step -1
      If Not Processes(i).MainWindowHandle.Equals(IntPtr.Zero) Then

        ProcessNamePat1(id) = Processes(i).ProcessName
        id += 1

      End If
    Next

    ReDim Preserve ProcessNamePat1(id - 1)

    'パターン2
    Dim StHwnd As IntPtr = GetForegroundWindow
    Dim ProcessID As Integer
    Dim ProcessNamePat2 As String
    Dim MWProcess As Process
    While StHwnd <> 0
      'StHwnd = GetNextWindow(StHwnd, 2)
      StHwnd = GetWindow(StHwnd, GetWindow_Cmd.GW_HWNDNEXT)
      GetWindowThreadProcessId(StHwnd, ProcessID)
      MWProcess = Process.GetProcessById(ProcessID)
      If Not MWProcess.MainWindowHandle.Equals(IntPtr.Zero) Then

        ProcessNamePat2 = MWProcess.ProcessName

      End If
    End While

  End Sub

引用返信 編集キー/
■54817 / inTopicNo.2)  Re[1]: 自フォームの前に使っていたフ゜ロセスの取得。
□投稿者/ 魔界の仮面弁士 (1912回)-(2010/11/03(Wed) 14:14:51)
掲示板の利用規約を再読願います。
http://bbs.wankuma.com/index.cgi?mode=man

》□ 書き込む際の注意
》半角カナは使用しないでください。文字化けの原因になります。


No54815 (たけたけ さん) に返信
> フ゜ロセスは取れるのですが、希望した順ではなく、どうしてもうまくいきません。
下記を参考に、自アプリを「非アクティブなフォーム」として実装してみては如何でしょう。
http://msdn.microsoft.com/ja-jp/library/cc440905.aspx

併せて、下記も参照してみてください。
http://dobon.net/vb/bbs/log3-25/14800.html
引用返信 編集キー/
■54819 / inTopicNo.3)  Re[2]: 自フォームの前に使っていたフ゜ロセスの取得。
□投稿者/ たけたけ (2回)-(2010/11/03(Wed) 15:57:04)
No54817 (魔界の仮面弁士 さん) に返信

> 掲示板の利用規約を再読願います。

注意不足で大変申し訳ありませんでした。気をつけたいと思います。

アドバイスいただいた点を試してみたのですが、どうしてもうまくいきません。
アクティブにならないButton2と通常のButton2で試してみました。
(スクリーンキーボードを作るも試したのですが、配置したButton1がなぜか表示されませんでした。)
結果として、両ボタンともなぜか4回目のクリックでnotepadにデータが貼りつきました。
申し訳ありませんが、アドバイスよろしくお願いします。


Me.Button2 = New ProcessNameGet.Form1.ExButton()

 'ボタンがアクティブにならないようにする
  Class ExButton
    Inherits Button

    Sub New()
      MyBase.New()
      Me.SetStyle(ControlStyles.Selectable, False)
    End Sub

  End Class

  Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
      Dim p As CreateParams = MyBase.CreateParams
      If Not MyBase.DesignMode Then
        p.ExStyle = p.ExStyle Or (WS_EX_NOACTIVATE)
      End If
      Return p
    End Get
  End Property

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim lngHwnd As Integer = GetForegroundWindow()
    lngHwnd = GetNextWindow(lngHwnd, 2)
    SetForegroundWindow(lngHwnd)

    Clipboard.SetDataObject("あいうえお", True)
    SendKeys.Send("^v")
  End Sub
  Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    Dim lngHwnd As Integer = GetForegroundWindow()
    lngHwnd = GetNextWindow(lngHwnd, 2)
    SetForegroundWindow(lngHwnd)

    Clipboard.SetDataObject("あいうえお", True)
    SendKeys.Send("^v")
  End Sub

引用返信 編集キー/
■54820 / inTopicNo.4)  Re[3]: 自フォームの前に使っていたフ゜ロセスの取得。
□投稿者/ たけたけ (3回)-(2010/11/03(Wed) 16:18:04)
すみません、なぜかButton4を配置し、CreateParamsをコメントアウトしたらButton4のクリックでnotepadにデータが貼りつきました。
なぜなのか理由がぜんぜんわからないのですが、目標の動作が実現できました。
ほんとありがとうございました。もし、追加情報がございましたらよろしくお願いします。


  'Protected Overrides ReadOnly Property CreateParams() As CreateParams
  '  Get
  '    Dim p As CreateParams = MyBase.CreateParams
  '    If Not MyBase.DesignMode Then
  '      p.ExStyle = p.ExStyle Or (WS_EX_NOACTIVATE)
  '    End If
  '    Return p
  '  End Get
  'End Property

 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Dim lngHwnd As Integer = GetForegroundWindow()
    lngHwnd = GetNextWindow(lngHwnd, 2)
    Dim ProcessID As Integer
    GetWindowThreadProcessId(lngHwnd, ProcessID)
    Dim wpro As Process = Process.GetProcessById(ProcessID)
    Dim hhwnd As IntPtr = wpro.MainWindowHandle

    SetForegroundWindow(hhwnd)
    Clipboard.SetDataObject("あいうえお", True)
    SendKeys.Send("^v")
  End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -