2016-07-22 13 views
0

この記事で質問されたような質問をwin10でC#SendInput to minimized window while you're working on other windowsとしています。'GetProcessIdOfThread'は常にゼロを返します

私が行うための最善の答えに続き、私は「GetProcessIdOfThreadは」いつもここで0

を返すようには動作しませんでした見つけるには、コードです:

public MainWindow() 
{ 
    InitializeComponent(); 

    IntPtr NotepadHandle = FindWindow("Notepad", "Untitled - Notepad"); 
    if (NotepadHandle == IntPtr.Zero) 
    { 
     MessageBox.Show("Notepad is not running."); 
     return; 
    } 
    uint noteid = GetProcessIdOfThread(NotepadHandle); 
    uint selfid = GetCurrentThreadId(); 
    bool attach = AttachThreadInput(selfid, noteid, true); 
    if (attach == false) 
    { 
     MessageBox.Show("attach fail"); 
     return; 
    } 
} 

は、私は何を誤解していましたか? ありがとうございました!

+0

この関数が成功すると、戻り値は指定されたスレッドに関連付けられたプロセスのプロセス識別子になります。関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、 'GetLastError'を呼び出します。 – Marusyk

+0

しかし、 'GetLastError'を直接呼び出さないでください - [' Marshal.GetLastWin32Error'](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getlastwin32error(v = 100).aspxを参照してください)。 –

答えて

1

MSDNは約GetProcessIdOfThread

は 指定されたスレッドに関連付けられているプロセスのプロセス識別子を取得します。

スレッドのハンドルの代わりにウィンドウのハンドル(HWND)を関数に渡しています。それがゼロを返す理由です。最初にスレッドのハンドルを取得するか、GetWindowThreadProcessId関数を直接呼び出して、HWNDからプロセスIDを取得することができます。

IntPtr notepadHandle = FindWindow("Notepad", "Untitled - Notepad"); 
if (notepadHandle == IntPtr.Zero) { 
    MessageBox.Show("Notepad is not running."); 
    return; 
} 
uint noteId; 
uint threadId = GetWindowThreadProcessId(notepadHandle , out noteId); 
if (threadId != 0) { 
    // Succeed 
} 
... 
関連する問題